从perl中的文本文件创建多维数组

时间:2013-11-20 19:36:21

标签: multidimensional-array

文件temp.txt包含如下内容:

ABC 1234 56 PQR
XYZ 8672 12 RQP

如何将temp.txt文件存储到二维数组中,以便我可以通过数组索引访问它们?

2 个答案:

答案 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'
      ]
    ];