为什么Perl打印中的二维数组不正确?

shu*_*ter 0 arrays perl data-structures

在Perl中处理二维数组让我很头疼.无论如何,以下是我的问题:

我有一个循环将一个数组(比如@twoOneArray)推入另一个数组,比如说@twoDimArray,然后在循环的下一次迭代开始之前重置,然后再次用新的值集推入@twoDimArray.当我使用以下任一方式打印此@twoDimArray时:

print Dumper \@twoDimArray;
Run Code Online (Sandbox Code Playgroud)

它给出了输出

OUTPUT

$VAR1 = [

      [

        'BB',

        'AA',

        'AA'
       ],
       $VAR1->[0],
       $VAR1->[0],
       $VAR1->[0]
     ];
Run Code Online (Sandbox Code Playgroud)

或使用循环

for (my $i=0; $i<4; $i++){
    for (my $j=0; $j<4; $j++){
         print "$twoDimArray[$i][$j] \n";
    }
}
Run Code Online (Sandbox Code Playgroud)

数据重复.

OUTPUT

行= 0 BB AA AA

行= 1 BB AA AA

行= 2 BB AA AA

行= 3 BB AA AA

等等....

我无法弄清楚为什么两种输出方式都出错了.如果我每次都打印@twoDimArray(在移动到循环的下一次迭代之前,即在使用push函数之后)插入@twoOneArray,那么值似乎很好并且不重复自己,但是在单个go中打印它似乎给出了上述错误.这里也有类似的问题,但我不确定这对我是否有意义.有什么建议?

构建2D数组的代码:

for ($k = 1; $k <= $counter; $k++){
        @twoOneArray = (); #reset it when loop starts again
        for ($j = 0; $j <= $colsInArray; $j++){
        #do stuff to create @twoOneDim
        }
        push @twoDimArray, \@twoOneArray;
        #if I print @twoDimArray if prints fine, with the exact values intact
}

print Dumper \@twoDimArray; #if I print it here it messes up
print "\n";
Run Code Online (Sandbox Code Playgroud)

inn*_*naM 10

Data :: Dumper的输出告诉我你的问题不是打印数组.Data :: Dumper永远不会说谎(或很少).

请告诉我们您用于构建阵列的代码.我确定错误在某个地方的代码中.

更新:

现在你添加了构建数组的代码,我发现你陷入了一个邪恶的陷阱:你正在将@twoOneArray的引用添加到你的"外部"数组中.但是每次通过循环时引用总是相同的.像这样更改你的代码:

for ($k = 1; $k <= $counter; $k++){
        my @twoOneArray; # REALLY reset it when loop starts again
        for ($j = 0; $j <= $colsInArray; $j++){
            #do stuff to create @twoOneDim
        }
        push @twoDimArray, \@twoOneArray;
}
Run Code Online (Sandbox Code Playgroud)

..它应该工作.