-1

我正在研究哈希键是哈希的要求。我遇到了可以完成这项工作的 cpanTie::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函数来计算哈希时,它不起作用。

4

1 回答 1

1

您的代码不起作用的原因Tie::RefHash显然是通过 Perl 的tie机制起作用。这意味着它通过 tie 的操作来发挥它的魔力,比如, STORE,FETCH等。FIRSTKEYNEXTKEY

您设置的初始化语句%hash_arg绕过所有这些,通过使编译器构造一个直接分配的哈希而不是通过 tie 机制

如果您重写代码以便在运行时应用作为哈希引用的键,那么一切正常

看看你的程序的这个重写。您可以从转储中看到,内部散列具有所有四个字符串键、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;"
于 2015-10-28T13:52:30.577 回答