perl - 在 Perl HoH 中访问嵌套哈希而不使用keys()?

标签 perl hash-of-hashes

考虑以下 HoH:

$h = {
    a => {
           1 => x
    },
    b => {
           2 => y
    },
    ...
}

有没有一种方法可以在不调用keys(%$h)的情况下检查第二个嵌套级别上是否存在哈希键?例如,我想说这样的话:

if ( exists($h->{*}->{1}) ) { ...

(我知道您不能使用 * 作为哈希键通配符,但您明白了...)

我试图避免使用 keys() 因为它会重置哈希迭代器,并且我正在循环中迭代 $h 使用:

while ( (my ($key, $value) = each %$h) ) {
    ...
}

我能找到的最接近的语言结构是 smart match operator (~~) mentioned here (并且在 perlref perldoc 中没有提及),但即使 ~~ 在 Perl 版本中可用,我也只能使用(5.8.4),据我所知,它不会在这种情况下工作。

如果无法完成,我想我会在进入 while 循环之前将键复制到数组或散列中(这就是我开始的方式),但我希望避免开销。

最佳答案

不是真的。如果您需要这样做,我想我会创建一个合并的哈希,列出所有二级键(在开始主循环之前):

my $h = {
    a => {
           1 => 'x'
    },
    b => {
           2 => 'y'
    },
};

my %all = map { %$_ } values %$h;

然后您的 exists($h->{*}->{1}) 变为 exists($all{1})。当然,如果您要修改循环内的二级哈希值,这将不起作用(除非您适本地更新 %all)。该代码还假设 $h 中的所有值都是哈希引用,但如果需要的话,这很容易修复。

关于perl - 在 Perl HoH 中访问嵌套哈希而不使用keys()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8058489/

相关文章:

perl - 如何解析文件、创建记录并对记录执行操作,包括术语频率和距离计算

xml - XML XPath 1.0-如何在XPath表达式中正确使用'not'函数

Ruby 快速从散列的散列中创建一个数组?

ruby - 在此代码中如何减少或注入(inject)工作

perl - 使用 Perl,如何使用 CSV 文件中的值创建图表?

用于登录 TopCoder 的 Perl 脚本

perl - 函数::参数 - "In method ...: missing type name after ' ['"是什么

perl - 如何构造哈希的哈希

arrays - Perl 中的多维数组或散列。访问项目

ruby - Ruby 中的哈希成语的哈希?