Perl中作为键的散列

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

我正在研究一个要求,其中散列的键是散列。我遇到了可以完成这项工作的cpan模式,但不知何故,即使我使用的是
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;"