考虑简单的Hash of Hash引用。当我解除(内部)哈希值并改变它的一些值时,这不会转移到哈希的原始哈希值。但是用箭头表示法确实如此。我检查箭头符号的地方只是简单的解释,所以给出了什么?
use Data::Dumper;
$HoH{"one"}={'f1' => "junk",
'f2' => 0};
$href = $HoH{"one"};
%hh=%{$HoH{"one"}};
print Dumper($href);
$href->{'f2'}=1;
$href->{'f1'}="newJunk";
print Dumper($HoH{"one"});
$hh{'f2'}=0;
$hh{'f1'}="oldJunk";
print Dumper($HoH{"one"});
答案 0 :(得分:5)
此行复制:
%hh=%{$HoH{"one"}};
之后,散列%hh
的更改不会反映在hashref $HoH{one}
中。
特别是,上面的行是列表赋值的一种形式,它执行复制。没有传递散列引用,如
的情况$href = $HoH{"one"};
答案 1 :(得分:2)
您的代码中有三个哈希值。
{}
创建的匿名版本。 (从现在开始,我将称之为%anon)%HoH
%hh
$HoH{"one"}={'f1' => "junk",'f2' => 0};
# $HoH{one} holds a ref to %anon
$href = $HoH{"one"}; # Copy the ref. $href holds a ref to %anon
%hh=%{$HoH{"one"}}; # Copy the hash referenced by $HoH{one} (i.e. %anon)
print Dumper($href); # Dumps the hash referenced by $href (i.e. %anon)
$href->{'f2'}=1; # Modifies the hash referenced by $href (i.e. %anon)
$href->{'f1'}="newJunk"; # Modifies the hash referenced by $href (i.e. %anon)
print Dumper($HoH{"one"}); # Dumps the hash referenced by $HoH{one} (i.e. %anon)
$hh{'f2'}=0; # Modifies %hh
$hh{'f1'}="oldJunk"; # Modifies %hh
print Dumper($HoH{"one"}); # Dumps the hash referenced by $HoH{one} (i.e. %anon)
为什么修改%hh
会影响%anon
?