Perl中作为键的散列
我正在研究一个要求,其中散列的键是散列。我遇到了可以完成这项工作的cpan模式,但不知何故,即使我使用的是Perl中作为键的散列,perl,cpan,tie,Perl,Cpan,Tie,我正在研究一个要求,其中散列的键是散列。我遇到了可以完成这项工作的cpan模式,但不知何故,即使我使用的是Tie::RefHash::Nestable,它对嵌套哈希也不起作用 my %hash_arg = (); tie %hash_arg, 'Tie::RefHash::Nestable'; my $hash = { 'mnp' => 1 }; %hash_arg = ( 'pqr' => { 'a;' => 1, 'i' =&g
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
%Hash_arg
有一个键pqr
,其值是对一个Hash的引用,该Hash还有一个Hash作为键。当我在pqr
的键上循环并尝试使用ref
函数来计算散列时,它不起作用。代码不起作用的原因是Tie::RefHash
显然是通过Perl函数起作用的。这意味着它通过tie的操作来发挥它的魔力,如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);
}
输出
您必须始终
在每个Perl程序的顶部使用strict
和警告'all'
。用你的代码试试吧,aboev,它可能会给你一些关于你做错了什么的线索这听起来很像一个-为什么你要尝试使用哈希作为哈希的键?我已经启用了strict和warning。我已经启用strict和warning。运行代码时未发现任何警告或错误。我收到的数据是我描述的形式。数据已使用Tie::RefHash绑定。我必须弄明白这一点。这就是我面临的问题所在。我在任何地方都找不到合适的引用或解决方案。“我启用了strict和warning。在运行代码时没有发现警告或错误。”这很有趣,因为当我在strict
和warnings
下运行您的代码时,我会在大小相同的列表中找到引用,如果您不在堆栈溢出问题上对我们撒谎,我们将不胜感激。难道我们没有办法撤销内部哈希吗?具有讽刺意味的是,它在没有嵌套的情况下工作,即“$hash”是%hash_arg的直接键。那样的话,它印得很好
"HASH"
"mn"
"c"
"i"
"HASH(0xd4c2f8)"
"a;"