This is a bug in Hash::Util . The code says:
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 }
but should be:
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 }
The problem is that Scalar::Util::reftype returns undef , not an empty string. The patch was sent to p5p. It doesn't look like Hash::Util is a double-life module (in the kernel and CPAN), so you have to update the version of Perl 5 with the corrected one. I suggest either fixing the code yourself, or writing your own version.
If you are writing your own version, do not use Internals :: SvREADONLY (the user level should not use material in the Internals package). Use Readonly::XS .
source share