我意识到在标量上下文中在Perl中计算数组是有用的:它会产生一些元素。
但是能够在标量上下文中评估哈希的实际用途是什么? e.g。
my $scalar_value = %hash;
scalar(%hash)
据我了解,它会生成一个类似“3/4
”的字符串,提供有关散列内部的一些信息,这些内容似乎只对调试很有用。
答案 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祝福哈希时,这也有帮助。 如果你知道会有很多钥匙,你可以加快速度。