我正在尝试循环使用包含有关系统及其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);
}
}
}
}
}
示例输出应该类似于
但反而出现了
但是在我的print语句中,在将列添加到输出数组之前,它正在写入正确的值。
答案 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