在标量上下文中评估Perl中的哈希的原因是什么?

时间:2012-02-21 20:31:51

标签: perl hash scalar

我意识到在标量上下文中在Perl中计算数组是有用的:它会产生一些元素。

但是能够在标量上下文中评估哈希的实际用途是什么? e.g。

  • my $scalar_value = %hash;

  • scalar(%hash)

据我了解,它会生成一个类似“3/4”的字符串,提供有关散列内部的一些信息,这些内容似乎只对调试很有用。

2 个答案:

答案 0 :(得分:14)

它生成一个可用作TRUE / FALSE标志的值,以了解散列是否为空(无键)。

举个例子:

if (%hash) {
    print "Hash has elements\n";
} else {
    print "Hash is empty\n";
}

if强制表达式进入标量上下文,因为它被用作布尔表达式。

这与在标量上下文中使用@array来测试空虚的概念非常相似:

if (@array) {
    # NOT empty!
}

答案 1 :(得分:1)

标量(%hash)允许您检查散列算法是否正常工作。如果您有1,000个密钥,并且您看到类似2/16的内容,则表示所有密钥仅解析为16个分配的桶中的2个。这意味着您的所有密钥都非常相似并导致大量冲突,从而导致在桶中进行长时间的顺序搜索。

默认存储桶数为8

perl -le '$h{a}=1;print scalar %h'
1/8

使用1000个桶预加密哈希值(最接近2的幂)

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h'
1/1024

当你为perl OO祝福哈希时,这也有帮助。 如果你知道会有很多钥匙,你可以加快速度。