11

I have the following hash:

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

I then print it like so:

print "".%villains;

I get the following output:

1/8

What semantics in Perl make this happen?

Thank you!

4

2 回答 2

13

您正在评估标量上下文中的哈希。当您执行此操作时,它实际上会返回与存储桶总数相比所触及的存储桶数量的一小部分,除非未使用散列,在这种情况下它评估为假。有关更多信息,请参阅此 perldoc(接近本节末尾)。

于 2013-09-26T05:57:06.767 回答
4

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

这可以为不熟悉哈希内部结构的任何人提供一些解释:当将项目添加到哈希中时,它们会根据哈希算法排列到存储桶中,以便更有效地检索它们。

例子

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

您将新的绿色福特野马添加到您的收藏中,使其进入绿色桶。下次你想找这辆车时,你可以直接去绿桶,有一个更小的选择可以搜索。

在此示例中,汽车集合是 a hash,每辆汽车都是 a hash entry,颜色是hashing algorithm4/5由于该系列还包含红色、蓝色和黑色汽车,因此它们使用水桶进行了相当有效的排列。

但是,如果您要将此系统用于一组红色汽车,则哈希算法将非常低​​效。它只会使用1/5桶,而寻找特定的汽车将涉及搜索整个集合。

于 2013-09-26T09:34:31.650 回答