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

如何在Perl中使用`lock_hash_recurse`?

发布时间:2020-12-16 06:22:06 所属栏目:大数据 来源:网络整理
导读:在继续讨论 here时,我对lock_hash_recurse有些麻烦,如下图所示: #!/usr/bin/perluse strict;use warnings;use Data::Dumper;use Hash::Util qw (lock_keys);my $hashref = {A=1,B={CC=22,DD=33}};lock_keys(%{$hashref}); # this is OKHash::Util::lock_has
在继续讨论 here时,我对lock_hash_recurse有些麻烦,如下图所示:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Hash::Util qw (lock_keys);

my $hashref = {A=>1,B=>{CC=>22,DD=>33}};

lock_keys(%{$hashref}); # this is OK
Hash::Util::lock_hash_recurse(%{$hashref}); # this fails: "Use of uninitialized value in string eq at /usr/lib/perl/5.10/Hash/Util.pm line 153."

据我所知,reftype返回undef …是lock_hash_recurse中的一个错误(也许这就是为什么它不会被导出?…)

解决方法

这是Hash :: Util中的一个错误.代码说:

sub lock_hashref_recurse {
    my $hash = shift;

    lock_ref_keys($hash);
    foreach my $value (values %$hash) {
        if (reftype($value); eq 'HASH') {
            lock_hashref_recurse($value);
        }
        Internals::SvREADONLY($value,1);
    }
    return $hash
}

但应该是:

sub lock_hashref_recurse {
    my $hash = shift;

    lock_ref_keys($hash);
    foreach my $value (values %$hash) {
        my $type = reftype($value);
        if (defined $type and $type eq 'HASH') {
            lock_hashref_recurse($value);
        }
        Internals::SvREADONLY($value,1);
    }
    return $hash
}

问题是Scalar :: Util :: reftype返回undef,而不是空字符串.补丁已发送到p5p.它看起来不像Hash :: Util是双生命(在核心和CPAN中)模块,所以你必须升级到Perl 5版本并修复它.我建议您自己修补代码或编写自己的版本.

如果您编写自己的版本,请不要使用Internals :: SvREADONLY(用户级别的东西不应该使用Internals包中的东西).请改用Readonly::XS模块.

(编辑:李大同)

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

    推荐文章
      热点阅读