Это ошибка в 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
.