Как мне использовать `lock_hash_recurse` в Perl? - PullRequest
4 голосов
/ 16 сентября 2010

Продолжая обсуждение здесь , у меня возникли некоторые проблемы с 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 (может, поэтому она не экспортируется? ...)

1 Ответ

6 голосов
/ 16 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...