继续讨论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
中的错误(也许这就是为什么它不会导出?...)
答案 0 :(得分:6)
这是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
模块。