请看下面的代码。 文件包含test.csv
aa,OPEN,TEMP1
bb,CLOSE,TEMP2
cc,OPEN,TEMP3
dd,TERMINATED,TEMP4
代码:
use Data::Dumper;
sub main {
my $file = 'test.csv';
my @lines1;
my @values;
unless (open (INPUT, $file)) {
print " files does not exist";
}
while (my $line = <INPUT>) {
@values = split /\s*,\s*/, $line;
push @lines1, \@values;
}
foreach my $rr(@lines1) {
print Dumper ($rr)."\n";
}
close INPUT;
}
main();
代码结果:
$VAR1 = [
'dd',
'TERMINATED',
'TEMP4
'
];
$VAR1 = [
'dd',
'TERMINATED',
'TEMP4
'
];
$VAR1 = [
'dd',
'TERMINATED',
'TEMP4
'
];
$VAR1 = [
'dd',
'TERMINATED',
'TEMP4
'
];
现在当我运行代码时,我得到的是最后一行打印4次。
但我在内部声明了数组@values
,而循环一切正常。
有人可以解释一下这种奇怪的行为。?
由于
答案 0 :(得分:3)
原因是当你在开始时声明@values
它是相同的数组值。所以你对同一个数组进行引用,这样每个循环都会覆盖以前的声明。但是,如果在循环中声明数组,那么在每次迭代的wnd处,数组将超出范围,并且amd不再指向该值。然后在下一次迭代期间,使用新值重新格式化数组。
答案 1 :(得分:3)
您的问题是您只有一个@values
数组,并且每次循环时,您只需覆盖同一数组中的值。因此,您最终会对同一个数组进行多次引用,该数组包含您放入其中的最后一组值。
一种解决方案是每次循环时创建一个新的@values
数组。
while (my $line = <INPUT>) {
my @values = split /\s*,\s*/, $line;
push @lines1, \@values;
}
另一种方法是获取数组的副本并将该引用推送到@lines1
。
while (my $line = <INPUT>) {
my @values = split /\s*,\s*/, $line;
push @lines1, [ @values ];
}