我的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'
答案 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};
问题解决了。