2014-07-17 48 views
1

如何将多层嵌套散列(例如%A)复制到另一个散列(例如%B)?我想确保新的哈希不包含与原始哈希(%A)相同的引用(指针)。如何复制嵌套散列

如果我改变了原始散列(%A)中的任何内容,它不应该在新散列(%B)中更改 中的任何内容。

我想要一个通用的方式做到这一点。我知道我可以通过为每个级别的密钥重新分配值 (例如,%{$ b {kb}} =%a;)来完成此操作。

但是,应该有这将工作密钥水平

问题实施例数(散列的散列的散列....散列的散列)无关的溶液

use Data::Dumper; 
my %a=(q=>{ 
      q1=>1, 
      q2=>2, 
     }, 
     w=>2); 
my %b; 
my %c; 
%{ $b{kb} } = %a; 

print "\%b=[".Data::Dumper::Dumper (%b)."] "; 
%{ $c{kc} } = %a; # $b{kb} = \%a; 
print "\n\%c=[".Data::Dumper::Dumper (%c)."] "; 

# CHANGE THE VALUE OF KEY IN ORIGINAL HASH %a 
$a{q}{q1} = 2; # $c{kc} = \%a; 
print "\n\%b=[".Data::Dumper::Dumper (%b)."] "; 
print "\n\%c=[".Data::Dumper::Dumper (%c)."] "; 

感谢您的帮助

+1

'$ b {kb} = {%a};'比'%{$ b {kb}} =%a;'更可读。与'$ b {kb} = \%a;'类似,可以更容易地进行对比。 – ikegami

+0

@ikegami大括号(例如'{%a}'是否获取变量的引用(地址)? – gsinha

+0

@ikegami感谢您提出改进意见。 com/q/14911586/1443563) – gsinha

回答

3

您想要的是通常称为“深层复制”,其中赋值运算符执行“浅层复制”。

use Storable qw(dclone); 

my $copy = dclone($src); 
+0

谢谢。 。 – gsinha