Perl散列在标方面

有时候当工作与哈希,你可以看到一些奇怪的部分。

这样品的程序:

#!/usr/bin/perl

my %h = (
    a => 1,
    b => 2,
);

print "hash: " . %h;

如果你上运行这个程序Perl5.22,输出这种程序将文本 hash: 2/8.

什么是这个分数?

你使用操作指 的散列是中使用的标上下文。 print "hash: " . %h; 的相同 print "hash: " . scalar(%h);

2/8 的结果表达 scalar(%h).

2/8 谈判有关的内部结构的散列。 这种使用情况的统计数据桶。 这是一个完全的内部厨房,这是很少的需要。 内部的散列分配的特别部分 所谓的桶在哪些数据存储。 什么是写到正确的分数是多少的 allochronic桶。 该数字左边的小部分是数目中实际使用的桶。 当你加入 值对在一散列在某一点allochronic桶的数量增加散工作 有效。

这里是一样的节目,展示了如何将这些图改变当增加值的散列:

#!/usr/bin/perl

use feature qw(say);

my %h;

foreach my $i (1 .. 17) {
    $h{$i} = $i;
    say "$i - " . scalar(%h);
}

这里是输出这种程序(注意,并非每次你加值中的散列增加 桶的数量):

1 - 1/8
2 - 2/8
3 - 3/8
4 - 3/8
5 - 4/8
6 - 4/8
7 - 4/8
8 - 5/16
9 - 5/16
10 - 6/16
11 - 6/16
12 - 6/16
13 - 6/16
14 - 7/16
15 - 8/16
16 - 12/32
17 - 12/32

有趣的是,这些数字是不稳定的。 如果你反复运行这Perl脚本,输出将可以略有不同。

不断变化的工作开始从Perl5.26

内部统计数据的散列只需要很少。 因此,开始从Perl版5.26,该行为的散列 在标方面的改变。 现在的散列在标量方面的回报数对数的元件的散列。 坦率地说,这是一个希望获得当你问一散列在标的背景。

来版本5.26Perl获得的数量元素对哈希需要编写 scalar(keys(%h));. Perl5.26现在这个数字使用可以得到 scalar(%h);.

但是,如果有人需要得到一小部分,与统计数据的散列,这是可以做到的使用 功能 bucket_ratio 从图书馆 Hash::Util. 这里是一个例子的一个程序,在Perl版5.26 显示的案文 hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

my %h = (
    a => 1,
    b => 2,
);

print "hash: " . bucket_ratio(%h);

额外的统计数据的散列

如果是这样,你要明白这是怎么回事。,它能够使用其他工具。 从Perl5.22在图书馆 Hash::Util 职能出现 bucket_stats_formatted,这是一个例子 其使用:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

my %h = (
    a => 1,
    b => 2,
);

print bucket_stats_formatted(\%h);

输出的这个程序:

Keys: 2 Buckets: 2/8 Quality-Score: 0.94 (Good)
Utilized Buckets: 25.00% Optimal: 25.00% Keys In Collision: 0.00%
Chain Length - mean: 1.00 stddev: 0.00
Buckets              8 [00000011]
Len   0  75.00%      6 [######]
Len   1  25.00%      2 [##]
Keys                 2 [11]
Pos   1 100.00%      2 [##]

其他文章