繁体   English   中英

散列作为 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机制 这意味着它通过像STOREFETCHFIRSTKEYNEXTKEY等 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM