哈希内容不会改变

时间:2014-08-29 21:47:15

标签: perl hash size

为什么哈希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

1 个答案:

答案 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";
}