为什么哈希hh
的内容不会改变?如何在调用func
之后保留主要部分的更改?
my @RR = (1,2);
foreach(@RR)
{
my %hh;
&func(\%hh);
print "SIZE: ".keys(%hh)."\n";
}
sub func
{
my %hh = %{$_[0]};
my $n="noob";
my $m="moon";
$hh{$n}{$m}[0]="hey";
$hh{$n}{$m}[1]="bye";
}
输出:
SIZE: 0
SIZE: 0
答案 0 :(得分:2)
您正在为每个循环迭代和每个子用法创建%hh
的新副本。您通过引用传递参数,但这无关紧要,因为您无论如何都要复制sub中的值。这样:
my %foo = %$bar;
..制作$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";
}