2012-02-06 68 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?那么,如果你修改这个散列,那么这个引用自然会指向一个不同的值。

相关问题