Perl băm vô trong bối cảnh

Đôi khi làm việc với băm, bạn có thể thấy một số kỳ lạ phân.

Đây là một mẫu chương trình:

#!/usr/bin/perl

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

print "hash: " . %h;

Nếu bạn chạy chương trình này trên Perl 5.22, đầu của chương trình này sẽ được văn bản hash: 2/8.

Đây là những gì phần nhỏ?

Khi bạn sử dụng sự điều hành điểm danh băm được sử dụng trong vô bối cảnh. print "hash: " . %h; là giống như print "hash: " . scalar(%h);

Chuỗi 2/8 là kết quả của những biểu hiện scalar(%h).

Chuỗi 2/8 nói về cấu trúc bên trong của băm. Này thống kê sử dụng xô. Đây là một hoàn toàn bộ nhà bếp, đó là rất hiếm khi cần thiết. Bên trong băm giao phần đặc biệt gọi là xô trong dữ liệu lưu trữ. Những gì được viết ở bên phải của các phần là số allochronic xô. Số bên trái của các phần là số thực sự sử dụng xô. Khi bạn thêm cặp giá trị trong một băm tại một số điểm allochronic số xô được tăng lên đến băm đã làm việc một cách hiệu quả.

Đây là một mẫu chương trình làm thế nào những con số này thay đổi khi bổ sung thêm giá trị cho một băm:

#!/usr/bin/perl

use feature qw(say);

my %h;

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

Đây là phần đầu của chương trình này (lưu ý rằng không phải tất cả thời gian anh thêm một giá trị trong băm tăng số nhóm):

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

Nó là thú vị mà những con số này không ổn định. Nếu bạn liên tục chạy này Perl, đầu sẽ hơi khác nhau.

Thay đổi công việc bắt đầu từ Perl 5.26

Bộ số liệu thống kê của băm chỉ cần thiết hiếm khi. Vì vậy, bắt đầu từ bản Perl 5.26, hành vi của băm trong vô bối cảnh đã thay đổi. Bây giờ các băm vô trong bối cảnh trả về một số — số cặp của các yếu tố trong băm. Và thành thật mà nói, đó là những gì người ta mong đợi để có được khi bạn truy cập vào một băm vô trong bối cảnh.

Đến phiên bản 5.26 Perl để có được số của cặp của các yếu tố trong băm cần thiết để viết scalar(keys(%h));. Perl 5.26 bây giờ, số này có thể được sử dụng scalar(%h);.

Nhưng nếu ai đó cần để có được một phần nhỏ với những số liệu thống kê cho băm, nó có thể làm được sử dụng chức năng bucket_ratio từ thư viện Hash::Util. Đây là một ví dụ về một chương trình trên bản Perl 5.26 hiển thị các văn bản hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

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

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

Số liệu thống kê khác trên băm

Nếu vậy, anh cần phải hiểu những gì đang xảy ra với Tiết, nó có thể sử dụng cụ khác. Từ Perl 5.22 trong thư viện Hash::Util chức năng xuất hiện bucket_stats_formatted, đây là một ví dụ sử dụng nó:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

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

print bucket_stats_formatted(\%h);

Đầu của chương trình này:

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 [##]

Các bài viết khác