输出AoA在循环中覆盖信息

时间:2013-10-03 16:05:12

标签: perl multidimensional-array

我正在尝试循环使用包含有关系统及其IP地址的各种信息的AoA。我正在成功运行命令以获取我需要的信息。当我在循环中有print语句时,它给了我正在寻找的正确信息。但是,当我运行之后创建一个CSV文件时,似乎只保存了每种类型系统的最后一个值并覆盖了之前的所有值。

foreach my $row(@data){
my @columns;
if((index($row->[0], 'Model_A') != -1)) != -1)){
   my @result = qx(echo y | command goes here);
    foreach my $i(@result){
            if($i =~ /Port ID:\s+(\d)/){
        $columns[2] = $1;
    } elsif($i =~ /IP ID:\s+\d+)/){
        $columns[3] = $1;
    } 
    elsif(index($i, 'Port Status') != -1){
        $columns[0] = $row->[0];
        $columns[1] = $row->[1];
        print "$columns[0] \t $columns[1] \t $columns[2] \t $columns[3] \n";
        push (@output, \@columns);
           }
         }
      }
   }
}

示例输出应该类似于

  • Model_A System 1 0 address_0
       Model_A System 1 1 address_1
       Model_A System 1 2 address_2
       Model_A System 1 3 address_3

但反而出现了

  • Model_A System 1 3 address_3
       Model_A System 1 3 address_3
       Model_A System 1 3 address_3
       Model_A System 1 3 address_3

但是在我的print语句中,在将列添加到输出数组之前,它正在写入正确的值。

1 个答案:

答案 0 :(得分:2)

您反复存储相同的数组引用,并将值保存到该数组中的硬编码索引,因此只保留最后的值。

my @columns;
...
foreach my $i(@result){
    ...
    push (@output, \@columns);   # identical reference each iteration

如果您在循环内而不是在循环内声明@columns数组,这可能会有效。这样,将为每次迭代创建一个新数组,而不是相同的数组。

foreach my $i(@result){
    ...
    my @columns;
    ...
    push (@output, \@columns);   # new reference each iteration