考虑以下环比:在不使用键()的情况下访问Perl 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
循环之前将密钥复制到一个数组或哈希值(这是我如何开始的),但我希望避免开销。
如果您要复制密钥列表,则不再需要使用(不幸的是)危险的'each%$ h',而是可以执行foreach循环。这个散列有多大? – Schwern
@Schwern:大约24,000个键(所有嵌套散列的总和)。它包含Sybase数据库的所有特权分配。我意识到我可以避免使用'each',或者复制密钥,或者找到其他的实现。只是想我会提出这个问题,看看是否有可能。 – MisterEd
我认为可以有效地做到这一点,但需要改变接口以及XS代码,以在每次迭代后保留哈希迭代器以防重置。 perl5i的'each()'方法有这样一个接口,但它不能抵抗你的情况。它想。 https://github.com/schwern/perl5i/issues/210 – Schwern