哈希作为 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。这意味着它通过 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;"
我正在处理一个要求,其中散列的键是散列。我遇到了可以完成这项工作的 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。这意味着它通过 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;"