2012-02-06 70 views
3

只是想知道如果我做錯了什麼或者如果這是一個Perl錯誤...我想創建一個哈希值的數組。我正在使用'push'將值放到數組中。首次向數組寫入散列可以正常工作,但是當我將第二個不同的散列推入數組時,第一個數組元素似乎會被我剛剛推入數組的內容覆蓋。這是爲什麼發生?請參見下面的代碼:爲什麼將一個散列推入一個數組看起來會覆蓋所有的數組元素?

use Data::Dumper; 

my %val; 

%val = (key1 => "Val1"); 

my @myArr; 

my $cnt = push(@myArr,\%val); 

print "After push (should contain 1 element): " . Dumper(@myArr) . "\n"; 

%val = (key2 => "Val2"); 

my $cnt = push(@myArr,\%val); 

print "After push 2: (should contain 2 different elements):" . Dumper(@myArr) . "\n"; 
print " You can see above that element 1 and 2 of the array equal each other when they should be different\n"; 

回答

18

「perl bug」 - 是的,胖的機會。 :-)

你正在將一個散列引用推入你的數組,然後改變這個散列,然後你再次推入相同的引用。

你可能需要一個拷貝或一個完全不同的散列:

不同的變量:

#!/usr/bin/perl 

use strict; # always use strict 
use warnings; 
use Data::Dumper; 

my (%val, %other_val, @myArr); 

%val  = (key1 => "Val1"); 
%other_val = (key2 => "Val2"); 

push(@myArr, \%val); 
push(@myArr, \%other_val); 

print Dumper(\@myArr) . "\n"; 

複製:

#!/usr/bin/perl 

use strict; # always use strict 
use warnings; 
use Data::Dumper; 

my (%val, %other_val, @myArr); 

%val = (key1 => "Val1"); 
push(@myArr, { %val }); 

%val = (key2 => "Val2"); 
push(@myArr, { %val }); 


print Dumper(\@myArr) . "\n"; 
+0

只是一個旁註。但是你的「複製」只有在散列是字符串值的簡單鍵時纔有效。如果%val也包含arrayrefs或hashrefs,則需要「深度複製」。最好的辦法是使用像「克隆」這樣的模塊。 http://search.cpan.org/perldoc?Clone – 2012-02-08 15:23:14

0

這是很自然的:你使用同一容器%val兩次。您明確地覆蓋其內容。

2

請注意,您是如何將參考推送到散列%val?那麼,如果你修改這個散列,那麼這個引用自然會指向一個不同的值。

相關問題