在继续讨论
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
模块.