perl中数组声明的奇怪行为

时间:2014-11-17 10:08:22

标签: perl

请看下面的代码。 文件包含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,而循环一切正常。 有人可以解释一下这种奇怪的行为。?

由于

2 个答案:

答案 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 ];
}