2009-07-16 167 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]元件相同的基本數據值的參考。