-->

为什么不是在Perl打印的二维数组是否正确?(Why isn't the two dimen

2019-09-19 06:00发布

在Perl处理二维数组是让我头疼。 不管怎样,下面是我的问题:

我有一个循环其推动阵列,说@twoOneArray,到另一个数组,说@twoDimArray,然后被复位循环的下一次迭代开始之前,然后再次推入@twoDimArray与新的一组值。 当我打印使用可以在本@twoDimArray:

print Dumper \@twoDimArray;

它给输出

OUTPUT

$VAR1 = [

      [

        'BB',

        'AA',

        'AA'
       ],
       $VAR1->[0],
       $VAR1->[0],
       $VAR1->[0]
     ];

或者使用循环

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

得到的数据复制。

OUTPUT

行= 0 BB AA AA

行= 1 BB AA AA

行= 2 BB AA AA

行= 3 BB AA AA

等等....

我无法弄清楚,为什么这两个输出的方式会是错误的。 如果我打印@twoDimArray每次@twoOneArray插入(移动到循环的下一次迭代,用推送功能后,即之前),那么价值观似乎要被罚款,而不是重复自己,但它打印在一个单一的去似乎给上述错误。 类似的问题已被要求在这里 ,但我不知道这是否对我来说很有意义。 有什么建议么?

代码来构建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";

Answer 1:

数据::自卸车的输出告诉我,你的问题是不是打印阵列。 数据::自卸车不会永远说谎(或很少)。

请告诉我们你用来建立数组的代码。 我敢肯定,错误是在代码的某个地方。

更新:

现在你又说,建立了数组的代码,我看你已经陷入一个邪恶的陷阱:你所添加的参考@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;
}

..它应该工作。



Answer 2:

你做了这样的事情:

@a = (1, 2, 3);
push @b, \@a;

@a = (2, 3, 4);
push @b, \@a;

# ...

问题是,你推@b参考 @a 。 所有引用指向同一个@aData::Dumper是告诉你,与它的$VAR->[0]的事情。

你需要做的是这样的:

$a = [ 1, 2, 3 ];
push @b, $a;

$a = [ 2, 3, 4] ;
push @b, $a;

# ....

这样一来, [ ... ]数组引用语法会令每一次一个新的引用数组。

我建议perlreftut和perlref的仔细阅读。

编辑:我看你已经发布你的代码,是的,你做我的例子断码。 更改为使用[ ... ]语法,你会没事的。



Answer 3:

您的问题已被别人充分的回答。 我要补充的是从输出Data::Dumper是在发现这样的问题有用:在[1]的数组元素被倾倒如$VAR1->[0] -换句话说,它是相同的基础的参考存储在数据值[0]的元素。



Answer 4:

如果你想要一个数组的数组,你应该推数组引用,如

my @a = qw(1 2 3 4 5 6 7 8);
my @b = qw(a b c d e f g h);
my @aOfa;

push(@aOfa, \@a);
push(@aOfa, \@b);


文章来源: Why isn't the two dimensional array in Perl printing correctly?