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);

追加の統計のハッシュ

その場合、必要な何が起きているのか理解するとともにCheshamで使用その他のツールです。 から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 [##]

その他の記事