加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:47:07 所属栏目:大数据 来源:网络整理
导读:我正在使用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
我正在使用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";

以上返回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";

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

解决方法

您得到的结果不正确,因为当您使用我的%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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读