如果您在标量上下文中评估哈希,您会得到什么?

Tud*_*tin 22 perl

请考虑以下代码段:

use strict;
use warnings;

my %a = ( a => 1,
          b => 2,
          c => 'cucu',
          d => undef,
          r => 1,
          br => 2,
          cr => 'cucu',
          dr => '321312321',

        );

my $c = %a;

print $c;
Run Code Online (Sandbox Code Playgroud)

结果是5/8,我不明白这代表什么.我在某个地方读到这个分数查看结果中的数字可能代表哈希中的桶数,但显然不是这种情况.

有谁知道如何在标量上下文中评估perl哈希值?

编辑

我添加了一些其他哈希打印:

use strict;
use warnings;

use 5.010;


my %a = ( a => 1,
          b => 2,
          c => 'cucu',
          d => undef,
          r => 1,
          br => 2,
          cr => 'cucu',
          dr => '321312321',

        );

my $c = %a;

say $c; # 5/8


%a = ( a => 1,
       b => 21,
       c => 'cucu',
       br => 2,
       cr => 'cucu',
       dr => '321312321',

      );

 $c = %a;

say $c; # 4/8

%a = ( a => 1,
       b => 2,
       c => 'cucu',
       d => undef,
       r => 1,
       br => 2,
       cr => 'cucu',
       dr => '321312321',
       drr => '32131232122',
      );

 $c = %a;

say $c; #6/8
Run Code Online (Sandbox Code Playgroud)

那么,你a => 1在哈希中称为"元组"就像一个桶?在这种情况下,为什么最后一个哈希仍然有8作为分母,当它有9'元组'?

谢谢大家直到现在的回复:)

ike*_*ami 23

哈希是链表的数组.散列函数将密钥转换为一个数字,该数字用作存储值的数组元素("bucket")的索引.链表处理多个键散列到同一索引("碰撞")的情况.

分数的分母是桶的总数.

分数的分子是具有一个或多个元素的桶的数量.

对于具有相同元素数量的哈希值,数字越大越好.返回6/8的碰撞比返回4/8的碰撞少.


小智 8

来自perldoc perldata:

如果在标量上下文中计算哈希值,则在哈希值为空时返回false.如果有任何键/值对,则返回true; 更准确地说,返回的值是一个字符串,由使用的桶数和分配的桶数组成,用斜杠分隔.

你的情况,你有五个值(1,2,''cucu',undef,和'321312321'已经由八个键(映射)a,b,c,d,r,br,cr,和dr).

  • @JackManey:您可以编辑您的答案以纠正错误.如果你这样做,我会提出你的答案,因为与你接受的答案不同,你实际上引用了文档. (3认同)
  • 事实上他碰巧有5个不同的价值只是巧合.您可以为每个键赋予不同的值,Perl仍然会报告5/8.存储桶的使用仅取决于散列中的密钥. (2认同)