哈希作为Perl中的键

时间:2015-10-28 13:21:33

标签: perl cpan tie

我正在研究散列键是散列的要求。我遇到了可以完成这项工作的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 个答案:

答案 0 :(得分:1)

您的代码不起作用的原因是Tie::RefHash显然可以通过Perl的tie mechanism工作。这意味着它通过领带的操作(例如STOREFETCHFIRSTKEYNEXTKEY等来实现其魔力。

您设置%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;"