考虑以下 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/