Хеши как ключи в 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;"