1

我正在尝试循环浏览其中包含有关系统及其 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 系统 1 0
    地址_0 Model_A 系统 1 1
    地址_1 Model_A 系统 1 2
    地址_2 Model_A 系统 1 3 地址_3

但结果却是

  • Model_A 系统 1 3
    地址_3 Model_A 系统 1 3地址_3 Model_A 系统 1 3
    地址_3 Model_A 系统 1 3
    地址_3

但是,在我的打印语句中,它会在将列添加到输出数组之前给出正确的值。

4

1 回答 1

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
于 2013-10-03T16:09:37.803 回答