我正在研究散列键是散列的要求。我遇到了可以完成这项工作的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
函数来计算哈希值时,它不起作用。
答案 0 :(得分:1)
您的代码不起作用的原因是Tie::RefHash
显然可以通过Perl的tie mechanism工作。这意味着它通过领带的操作(例如STORE
,FETCH
,FIRSTKEY
,NEXTKEY
等来实现其魔力。
您设置%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;"