gpt4 book ai didi

perl - 如何在 Perl 中使用 `lock_hash_recurse`?

转载 作者:行者123 更新时间:2023-12-05 00:40:20 26 4
gpt4 key购买 nike

在继续讨论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 取而代之的是模块。

关于perl - 如何在 Perl 中使用 `lock_hash_recurse`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3727619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com