在读取文件时创建多维数组 - Perl

时间:2016-02-20 11:10:59

标签: arrays perl multidimensional-array

我对Perl完全不熟悉,而且我已经分配了一些任务......我必须读取一个制表符分隔文件,然后对数据库中的数据进行一些操作。 .tsv文件是这样的:

ID名称日期

155 Pedro 1988-05-05

522 Mengano 2002-08-02

到目前为止,我认为使用文件数据创建一个多维数组将是以后处理这些数据的好方法。所以我逐行读取文件,跳过项目标题列并将值保存在数组中。但是,我在创建这个多维数组时遇到了困难......这就是我到目前为止所做的:

#Read file from path
my @array;
my $fh = path($filename)->openr_utf8;
while (my $line = <$fh>) {
    chomp $line;
    # skip comments and blank lines and title line
    next if $line =~ /^\#/ || $line =~ /^\s*$/ || $line =~ /^\+/ || $line =~ /ID/;
    #split each line into array
    my @aux_line = split(/\s+/, $line);
    push @array, @{ $aux_line };
    }

显然,最后一行不起作用......如何以这种方式创建数组数组?我对引用有点迷失......有人可以想出一种更好的方法来存储我们从文件中读取的数据吗?谢谢!

2 个答案:

答案 0 :(得分:2)

您也可以使用map

执行此操作
use Data::Dumper;
my @stuff = map {[split]} <$fh>;
print Dumper \@stuff;

(可能是grep跳过评论)

但是它可能更适合你的用例使用一系列哈希:

my @stuff ;
chomp(my @header = split ' ', <$fh>);
while ( <$fh>)  {
    my %this_row;
    @this_row{@header} = split;
    push ( @stuff, \%this_row) ;
}

答案 1 :(得分:1)

首先,use strictuse warnings。这会立即提醒您,错误的方法是获取数组引用尝试访问完全不同的变量(Perl允许不同类型的变量具有相同的名称)。

之后只需将您的最后一行更改为:

push @array, \@aux_line;