Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays perl:为什么将数组从数组中移出会增加额外的间接寻址级别?_Arrays_Perl - Fatal编程技术网

Arrays perl:为什么将数组从数组中移出会增加额外的间接寻址级别?

Arrays perl:为什么将数组从数组中移出会增加额外的间接寻址级别?,arrays,perl,Arrays,Perl,我的CSV文件的第一行包含以下字段的名称。 我将文件读入一个数组,并尝试将其从第0行移出 但该数组似乎被包装在另一个数组级别 我怎样才能摆脱那种额外的间接性呢 代码如下: open CSV, "ExDivExport.csv" or die;; @fields=(); while (<CSV>) { chomp; ($temp) = /^"(.+)"$/; # remove first and last " @line=split /","/, $temp ;

我的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'  
打开CSV,“ExDivExport.CSV”或die;;
@字段=();
而()
{chomp;
($temp)=/^“(.+)”$/##删除第一个和最后一个”
@行=拆分/“,”/,$temp;
“打印”\n@line“;#这里所有的行都打印正确
按@fields,[@line];
}
@name=shift@fields;#这里我从第0行移走
打印“\nat12名称=@names”#打印:数组(0x26e52c)
打印“\nat13名称[0]=$names[0]”;#打印数组(0x26e52c)
打印“\nat14名称[0][0]=$names[0][0]”;#正确打印名字“Symbol”
您的代码将数组存储到
@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提供的经过良好测试和记录的模块,如

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

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

打开我的$CSV,”所以,我所要做的就是替换:

@名称=移位@字段

@名称=@{shift@fields}


问题已解决。

如果您摆脱了额外级别的间接寻址,那么您将拥有一个包含csv文件所有行中所有值的数组。这是您真正想要的吗?无论哪种方式,您都不应该自己解析csv,您应该使用库,否则您可能会被边缘情况所困扰。
Text::csv
将是一个很好的choice:额外的级别即将到来,因为您正在将
[@line]
推到
@fields
数组中。
[…]
将内容包装在数组引用中。当我说$names=shift@fields;时,我只会不断获取对同一数组的引用,因此所有成员最终都指向最后一个数组。我需要传递一个深度副本。@user1067305:那么您的程序比您显示的要多,您必须问另一个问题。@user1067305您为什么需要这样做d深度复制?“shift”将从外部阵列中删除旧阵列,并且它将丢失。Re“并且不要忘记
关闭$CSV”,为什么?如果不使用autodie,添加这些内容是无用的;
@mwp,它们在文件末尾时超出范围。如果它们不超出范围,我宁愿创建范围,也不愿添加
关闭
,因为没有理由保留关闭的文件句柄!正如您发现的“间接寻址级别”“不是由
shift
添加的。每一行都有,但你想把它删除以提取名字列表。这是一个令人敬畏的解决方案。它不需要创建数组的副本。如前所述,您应该使用
my$names=shift@fields