【发布时间】:2014-09-16 21:52:18
【问题描述】:
我经常写这样的代码片段:
if (exists $myHash->{$key}) {
$value = $myHash->{$key};
}
如果哈希中有那个键,我想做的是从哈希中获取值,同时如果哈希条目不存在,我想避免自动激活它。
然而,这让我感到非常低效:我正在做一个哈希查找以找出一个键是否存在,然后如果它确实存在,我正在对同一个键进行另一个哈希查找以提取它。
在多级结构中效率会更低:
if (exists $myHash->{$key1}
&& exists $myHash->{$key1}{$key2}
&& exists $myHash->{$key1}{$key2}{$key3}) {
$value = $myHash->{$key1}{$key2}{$key3};
}
这里我大概做了 9 次哈希查找而不是 3 次!
perl 是否足够聪明来优化这种情况?或者是否有其他一些习惯用法可以在不自动激活条目或进行两次连续查找的情况下获取哈希值?
我知道autovivification 模块,但如果可能的话,我正在寻找不需要安装 XS 模块的解决方案。此外,我还没有机会尝试这个模块,我不完全确定在多级哈希的情况下会发生什么 - pod 说:
$h->{$key}
如果密钥不存在,将返回 undef - 这是否意味着:
$h->{$key1}{$key2}
如果 $key1 不存在会死吗,因为我试图取消引用 undef?如果是这样,为了避免这种情况,大概您仍然需要进行多级测试才能存在。
【问题讨论】:
标签: perl hashtable exists autovivification