将数据文件读入数组的正确方法

use*_*850 30 perl

我有一个数据文件,每行有一个数字,比如

10
20
30
40
Run Code Online (Sandbox Code Playgroud)

如何读取此文件并将数据存储到数组中?

这样我就可以对这个数组进行一些操作了.

Sea*_*ean 77

只需将文件读入一个数组,每个元素一行,是微不足道的:

open my $handle, '<', $path_to_file;
chomp(my @lines = <$handle>);
close $handle;
Run Code Online (Sandbox Code Playgroud)

现在文件的行在数组中@lines.

如果你想确保有错误处理,openclose执行类似的操作(在下面的剪辑中,我们也以UTF-8模式打开文件):

my $handle;
unless (open $handle, "<:encoding(utf8)", $path_to_file) {
   print STDERR "Could not open file '$path_to_file': $!\n";
   # we return 'undefined', we could also 'die' or 'croak'
   return undef
}
chomp(my @lines = <$handle>);
unless (close $handle) {
   # what does it mean if close yields an error and you are just reading?
   print STDERR "Don't care error while closing '$path_to_file': $!\n";
} 
Run Code Online (Sandbox Code Playgroud)

  • 您应该通过检查返回值或使用autodie来处理"打开"失败的情况.为了正确纠正你也应该为'关闭'做同样的事情. (4认同)

Tar*_*ras 12

使用File::Slurp模块有最简单的方法:

use File::Slurp;
my @lines = read_file("filename", chomp => 1); # will chomp() each line
Run Code Online (Sandbox Code Playgroud)

如果您需要对每条线路进行一些验证,您可以grep在前面使用read_file.

例如,仅包含整数的过滤行:

my @lines = grep { /^\d+$/ } read_file("filename", chomp => 1);
Run Code Online (Sandbox Code Playgroud)

  • 第一.如果有人真的需要chomp(),那么使用选项read_file("filename",chomp => 1)而不是map.第二.我不认为有人真的需要验证.问题不是如何从文件中读取数字.第三.你不检查像3.1415这样的数字.向前.您可能想使用grep {/ ^\d + /}而不是map. (2认同)

小智 10

我喜欢...

@data = `cat /var/tmp/somefile`;
Run Code Online (Sandbox Code Playgroud)

它并不像其他人那样迷人,但是,它的工作方式完全相同.和...

$todays_data = '/var/tmp/somefile' ;
open INFILE, "$todays_data" ; 
@data = <INFILE> ; 
close INFILE ;
Run Code Online (Sandbox Code Playgroud)

干杯.

  • 这不是一个很好或安全的方式来做到这一点。见 http://perl-begin.org/tutorials/bad-elements/#slurp (2认同)