【发布时间】:2011-11-08 23:29:51
【问题描述】:
考虑以下 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:大约 24,000 个键(所有嵌套哈希的总和)。它包含 Sybase 数据库的所有权限分配。我意识到我可以避免
each,或者复制密钥,或者找到其他一些实现。只是想我会提出这个问题,看看是否有可能。 -
我认为可以有效地做到这一点,但需要更改接口以及 XS 代码以在每次迭代后保留哈希迭代器,以防它被重置。 perl5i 的
each()方法有这样一个接口,但它并不能防御你的情况。它愿意。 github.com/schwern/perl5i/issues/210
标签: perl hash-of-hashes