您爲每個循環迭代,每個子使用而造成的%hh
新副本。您通過引用傳遞參數,但這並不重要,因爲您無論如何都在子集內複製值。這:
my %foo = %$bar;
..makes的$bar
副本,並%foo
任何更改不上$bar
過去了。
這裏是你的腳本中的註釋版本:
foreach(@RR)
{
my %hh; # new variable %hh created each loop iteration
&func(\%hh); # hash passed by reference
print "SIZE: ".keys(%hh)."\n";
}
sub func
{
my %hh = %{$_[0]}; # new variable %hh created, key/values copied
my $n="noob";
my $m="moon";
$hh{$n}{$m}[0]="hey"; # copy of %hh affected
$hh{$n}{$m}[1]="bye";
} # copy of %hh goes out of scope, values lost
如果你想這個工作預期,就需要使用真正的參考:
sub func {
my $ref = shift;
$ref->{"noob"}{"moon"}[0] = "hey";
$ref->{"noob"}{"moon"}[1] = "bye";
}
來源
2014-08-29 22:03:46
TLP
您正在創建一個新的詞彙變量'%hh'用於for循環的每次迭代。 – TLP 2014-08-29 21:51:23
我知道,但即使在每次迭代中,在調用'func'後,'%hh'仍然爲空。 – user3991583 2014-08-29 21:54:16
您在子文件中創建'%hh'的新實例。它會隱藏循環中以前的'%hh'實例。您正在傳遞引用,但是取消引用它並在您的子文件夾中創建副本。 – TLP 2014-08-29 21:55:37