Хеши как ключи в Perl

Я работаю над требованием, в котором ключи хэша являются хэшем. Я наткнулся на cpan modue Tie::RefHash который может выполнять работу, но почему-то он не работает для вложенных хэшей, хотя я использую Tie::RefHash::Nestable,

my %hash_arg = ();
tie %hash_arg, 'Tie::RefHash::Nestable';
my $hash = { 'mnp' => 1 };
%hash_arg = (
    'pqr' => {
        'a;'  => 1,
        'i'   => 1,
        'mn'  => 1,
        'c'   => 1,
        $hash => 1
    }
);

гашиш %hash_arg имеет ключ pqr значение которого является ссылкой на хеш, который имеет дополнительный хеш в качестве ключа. Когда я перебираю ключи pqr и попытаться использовать ref Функция, чтобы выяснить хэш, это не работает.

1 ответ

Решение

Причина, по которой ваш код не работает, состоит в том, что Tie::RefHash работает, очевидно, через механизмсвязи Perl. Это означает, что он делает свое волшебство через операции связи, как STORE, FETCH, FIRSTKEY, NEXTKEY и т.п.

Ваше заявление инициализации, где вы настроили %hash_arg обходит все это, заставляя компилятор создавать хеш, который назначается напрямую, а не через механизм связи

Если вы переписываете свой код так, чтобы ключ, являющийся ссылкой на хэш, применялся во время выполнения, тогда все работает нормально

Взгляните на это переписать вашу программу. Из дампа видно, что во внутреннем хеше есть все четыре строковых ключа, строковый ключ HASH(0xd4c2f8) назначенный компилятором, и правильный ссылочный ключ хеша, который выглядит как HASH

use strict;
use warnings 'all';
use v5.10;

use Tie::RefHash;
use Data::Dump;

tie my %hash_arg, 'Tie::RefHash::Nestable';

my $hash = { 'mnp' => 1 };

%hash_arg = (
    pqr => {
        'a;'  => 1,
        i     => 1,
        mn    => 1,
        c     => 1,
        $hash => 1,
    },
);

$hash_arg{pqr}{$hash} = 1;

for my $key ( keys %{ $hash_arg{pqr} } ) {
    dd (ref $key or $key);
}

выход

"HASH"
"mn"
"c"
"i"
"HASH(0xd4c2f8)"
"a;"
Другие вопросы по тегам