2009-07-16 123 views
0

在Perl中处理二维数组让我头疼。不管怎样,下面是我的问题:为什么Perl中的二维数组打印不正确?

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

print Dumper \@twoDimArray; 

它给输出

输出

$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插入(移动到循环的下一次迭代,用推送功能后,即之前),那么价值观似乎要被罚款,而不是重复自己,但它打印在一个单一的去似乎给上述错误。类似的问题已被问here,但我不确定它是否对我有意义。有什么建议么?

代码来构建二维数组:

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"; 
+1

总是在所有Perl程序的开头使用`warnings`和`strict strict``。 – 2009-07-16 18:57:59

+0

@brad:我知道。上面的代码是实际代码的一小部分。所以这就是为什么不写在这里。 – shubster 2009-07-16 19:07:33

+1

查看`perldoc perldsc`的这部分,他描述了“重复引用同一个内存位置”的部分:http://perldoc.perl.org/perldsc.html#COMMON-MISTAKES整个教程非常好,就像`perldoc perllol` @ – Telemachus 2009-07-16 19:29:43

回答

10

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

请向我们展示您用于构建阵列的代码。我确定这个错误在代码中。

UPDATE:

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

..它应该工作。

-3

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

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); 
4

你已经做了这样的事情:

@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的仔细阅读。

编辑:我看到你已经发布你的代码,是的,你正在做我的示例破碎的代码。更改为使用[ ... ]语法,你会没事的。

4

您的问题已被其他人充分回答。我要补充的是从Data::Dumper输出是在发现这样的问题有用:您的阵列的[1]元件被转储为$VAR1->[0] - 换句话说,它是存储在[0]元件相同的基本数据值的参考。