Perl:从子例程返回后,哈希值发生了变化

Lah*_*arl 5 perl hash return-value subroutine

我正在使用perl中的哈希,但是不明白为什么哈希值会在以下内容中发生变化:

use strict;

sub test
{
    my ($value_ref) = @_;
    my %value = %$value_ref;
    $value{'abc'}{'xyz'} = 1;
}

my %hash;
$hash{'abc'}{'xyz'} = 0;
test (\%hash);
print "$hash{'abc'}{'xyz'}\n";
Run Code Online (Sandbox Code Playgroud)

以上返回1,为什么它不会像这样返回0呢?

use strict;

sub test
{
    my ($value_ref) = @_;
    my %value = %$value_ref;
    $value{'abc'} = 1;
}

my %hash;
$hash{'abc'} = 0;
test (\%hash);
print "$hash{'abc'}\n";
Run Code Online (Sandbox Code Playgroud)

我想它与我如何传递%hash有关.我错过了什么?

Hun*_*len 7

您得到的结果不正确,因为当您使用您的哈希副本时,my %value = %$value_ref;您只获得顶级键.带键的第二级'xyz'是实际存储值的级别,因此对该引用的任何更改都会被转移.当您需要深层复制时,您正在执行浅拷贝.

幸运的是,有一个CPAN模块!

use strict;
use Storable qw(dclone);

sub test
{
    my ($value_ref) = @_;
    my %value = %{ dclone($value_ref) };
    $value{'abc'}{'xyz'} = 1;
}

my %hash;
$hash{'abc'}{'xyz'} = 0;
test (\%hash);
print "$hash{'abc'}{'xyz'}\n"; # prints 0
Run Code Online (Sandbox Code Playgroud)