文件temp.txt包含如下内容:
ABC 1234 56 PQR
XYZ 8672 12 RQP
如何将temp.txt文件存储到二维数组中,以便我可以通过数组索引访问它们?
答案 0 :(得分:1)
至少,你可以这样做
my @file = load_file($filename);
sub load_file {
my $filename = shift;
open my $fh, "<", $filename or die "load_file cannot open $filename: $!";
my @file = map [ split ], <$fh>;
return @file;
}
这将读取一个参数文件,将内容拆分为空白并将其放入数组ref(每行一个),然后返回数组引用的数组。退出子例程时,文件句柄将被关闭。
在某些方面,这是一个有点笨重的解决方案。它将整个文件加载到内存中,当您查找特定值时,它没有特别快的查找等。如果每行中都有一个唯一键,则可以使用哈希而不是数组来进行查找更快:
my %file = map { my ($key, @vals) = split; $key => \@vals; } <$fh>;
请注意,键必须是唯一的,否则它们会相互覆盖。
或者您可以使用Tie::File
仅查找所需的值:
use Tie::File;
tie my @file, 'Tie::File', $filename or die "Cannot tie file: $!";
my $line = [ split ' ', $file[0] ];
或者,如果您的文件行上有特定的分隔符,并且格式符合CSV格式,则可以使用Tie::File::CSV
use Tie::File::CSV;
tie my @file, 'Tie::Array::CSV', $filename, sep_char => ' '
or die "Cannot tie file: $!";
my $line = $file[0];
请注意,使用此模块可能过度,如果您没有严格的csv格式,可能会导致问题。此外,Tie::File
的声誉也在降低。哪种解决方案最好取决于您的需求和偏好。
答案 1 :(得分:1)
use File::Slurp;
use Data::Dumper;
my @arr = map [split], read_file("temp.txt");
print Dumper \@arr;
输出
$VAR1 = [
[
'ABC',
'1234',
'56',
'PQR'
],
[
'XYZ',
'8672',
'12',
'RQP'
]
];