在Perl中,为什么将哈希与字符串连接会得到一个看起来像分数的结果?

11

我有以下哈希:

my %villains = {
    "Boba" => "Fett",
    "Darth" => "Vader",
    "Moff" => "Tarkin",
}

然后我这样打印它:

print "".%villains;

我得到了以下输出:

1/8

Perl中的语义是什么导致了这种情况?

谢谢!


6
请注意,此处分配了一个带有引用但没有值的键。将哈希内容放在花括号({})中会分配一个_哈希引用_,而不是哈希本身。您声明了一个哈希并提供了一个_哈希引用_。因此,您永远不会填充超过一个桶。 - PP.
这是一个非常好的第一个问题。做得很好! - simbabque
2个回答

13
你正在标量上下文中评估哈希。当你这样做时,它实际上返回被访问的桶的数量与总桶数的比例,除非哈希尚未被使用,在这种情况下它将计算为false。详见此perldoc获取更多信息(在该部分末尾)。

4

如果您在标量上下文中评估哈希表,则如果哈希表为空,则返回false。 如果有任何键/值对,则返回true; 更确切地说,返回的值是由使用的桶数和分配的桶数组成的字符串,用斜杠分隔。 这基本上只有在找出Perl的内部哈希算法是否在您的数据集上表现不佳时才非常有用。

对于不熟悉哈希表内部结构的人来说,这可能需要一些解释:当项目被添加到哈希表时,它们会根据哈希算法排列成桶,以便更有效地检索。

示例

您正在收集玩具汽车。 为了更轻松地找到您的汽车,您决定根据颜色将它们放入不同的桶中。 您有红色,黄色,绿色,蓝色和黑色汽车的存储桶。

你往车库里添加了一辆新的绿色福特野马,所以它被放进了“绿色”桶里。下次你想找这辆车时,可以直接去“绿色”桶,搜索范围会更小。
在这个例子中,汽车收藏是一个哈希表,每辆车都是一个哈希条目,颜色是哈希算法。由于收藏还包含红、蓝和黑色的汽车,它们被安排得相当有效,使用了4/5的桶。
然而,如果你要用这个系统来管理红色汽车的收藏,哈希算法将非常低效。它只会使用1/5的桶,找到特定的汽车需要搜索整个收藏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接