2014-07-17 50 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