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有关.我错过了什么?
您得到的结果不正确,因为当您使用您的哈希副本时,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)
| 归档时间: |
|
| 查看次数: |
673 次 |
| 最近记录: |