10

我意识到在标量上下文中评估 Perl 中的数组很有用:它会产生 # 个元素。

但是,能够在标量上下文中评估散列的实际用途是什么?例如

  • my $scalar_value = %hash;

  • scalar(%hash)

据我了解,它会生成一个类似 " 3/4" 的字符串,提供有关哈希内部的一些信息,这些信息似乎仅对调试有用。

4

2 回答 2

14

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

举个例子:

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

if由于将表达式用作布尔表达式,因此将表达式强制转换为标量上下文。

这是一个非常类似于@array在标量上下文中测试空性的概念:

if (@array) {
    # NOT empty!
}
于 2012-02-21T20:33:14.620 回答
1

scalar(%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 祝福哈希时,这也很有帮助。如果你知道会有很多键,你可以加快速度。

于 2012-02-22T04:29:24.380 回答