[英]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机制。 这意味着它通过像STORE
、 FETCH
、 FIRSTKEY
、 NEXTKEY
等 tie 的操作来FIRSTKEY
它的魔力。
您设置%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;"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.