哈希作为 Perl 中的键

Hashes as Keys in Perl

我正在处理一个要求,其中散列的键是散列。我遇到了可以完成这项工作的 cpan 模块 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 函数计算散列时,它不起作用。

你的代码不工作的原因是 Tie::RefHash 工作,显然,通过 Perl 的 tie mechanism。这意味着它通过 STOREFETCHFIRSTKEYNEXTKEY

等平局操作发挥其魔力

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