perl:为什么从一个数组数组中移出一个数组会增加一个额外的间接级别?

时间:2016-08-29 03:42:43

标签: arrays perl

我的CSV文件的第一行包含以下字段的名称。 我将文件读入一个数组数组,并尝试从第0行移开。

但是数组似乎包含在另一个数组级别中。

如何摆脱额外的间接水平?

以下是代码:

open CSV, "ExDivExport.csv" or die;;
@fields=();
while (<CSV>) 
{   chomp;
    ($temp) = /^"(.+)"$/; # remove first and last "
    @line=split /","/, $temp ;
    print"\n@line";  # all the lines print correctly here
    push @fields, [@line];
}
@names = shift @fields;   # Here I shift off the 0th row

print "\nat12 names=@names";         # prints: ARRAY(0x26e52c)
print "\nat13 names[0]=$names[0]";   # prints ARRAY(0x26e52c)
print "\nat14 names[0][0]=$names[0][0]"; # correctly prints first name 'Symbol'  

2 个答案:

答案 0 :(得分:1)

您的代码将reference数组存储到@fields变量中,因此有必要更改您尝试提取此类数据的方式:

$names = shift @fields;               # get a reference, so use $ sigil (scalar)
print "\nat12 names=@$names";         # dereference array ref
print "\nat13 names[0]=$names->[0]";  # get the first element (access with -> notation)

我认为您正在尝试将其用于学习目的。另外,如果您认真解析CSV,最好使用CPAN中经过充分测试和记录的模块,例如Text::CSV

另外,出于调试目的,如果要分析变量的结构,Data::Dumper可能会帮助您理解它。例如:

print Dumper(\@names), "\n";

您的代码以旧方式打开文件。有一种现代的方法,使用3个参数:

open CSV, "ExDivExport.csv" or die;;

应该是

open my $CSV, '<', 'ExDivExport.csv' or die "cannot open file: $!";
#... then use the lexical variable $CSV instead of the CSV bareword

并且不要忘记close $CSV;

答案 1 :(得分:0)

所以,我所要做的就是替换:

@names = shift @fields;

@names = @ {shift @fields};

问题解决了。