Perl hash dalam konteks skalar

Kadang-kadang ketika bekerja dengan hash, anda dapat melihat beberapa aneh fraksi.

Berikut ini adalah contoh program:

#!/usr/bin/perl

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

print "hash: " . %h;

Jika anda menjalankan program ini pada Perl 5.22, output dari program ini akan menjadi teks hash: 2/8.

Apa fraksi ini?

Ketika anda menggunakan operator titik hash digunakan dalam konteks skalar. print "hash: " . %h; adalah sama seperti print "hash: " . scalar(%h);

String 2/8 adalah hasil dari ekspresi scalar(%h).

String 2/8 berbicara tentang struktur internal dari hash. Ini statistik penggunaan ember. Ini adalah benar-benar internal kitchen, yang sangat jarang diperlukan. Di dalam hash yang dialokasikan khusus bagian disebut ember di mana data disimpan. Apa yang tertulis di sebelah kanan fraksi adalah jumlah allochronic ember. Nomor di sebelah kiri dari fraksi adalah jumlah yang benar-benar digunakan ember. Ketika anda menambahkan pasangan nilai di hash di beberapa titik allochronic jumlah ember meningkat untuk hash yang bekerja efektif.

Berikut ini adalah contoh program yang menunjukkan bagaimana angka-angka ini berubah ketika menambahkan nilai hash:

#!/usr/bin/perl

use feature qw(say);

my %h;

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

Berikut ini adalah output dari program ini (perhatikan bahwa tidak setiap kali anda menambahkan sebuah nilai hash meningkat jumlah ember):

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

Yang menarik adalah bahwa angka-angka ini tidak stabil. Jika anda berulang kali menjalankan skrip Perl ini, output akan sedikit berbeda.

Mengubah pekerjaan mulai dari Perl 5.26

Internal statistik hash yang diperlukan hanya jarang. Oleh karena itu, mulai dari Perl versi 5.26, perilaku hash dalam konteks skalar berubah. Sekarang hash dalam konteks skalar kembali jumlah — jumlah pasang elemen pada hash. Dan terus terang, itu adalah apa yang orang akan berharap untuk mendapatkan ketika anda mengakses sebuah hash dalam konteks skalar.

Untuk versi 5.26 Perl untuk mendapatkan jumlah pasang elemen pada hash yang diperlukan untuk menulis scalar(keys(%h));. Perl 5.26 sekarang nomor ini dapat diperoleh dengan menggunakan scalar(%h);.

Tetapi jika seseorang perlu mendapatkan sebagian kecil dengan statistik untuk hash, itu adalah mungkin untuk tidak menggunakan fungsi bucket_ratio dari perpustakaan Hash::Util. Berikut adalah contoh sebuah program yang di Perl versi 5.26 menampilkan teks hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

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

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

Statistik tambahan pada hash

Jika demikian, anda perlu memahami apa yang terjadi dengan Chesham, itu adalah mungkin untuk menggunakan alat-alat lain. Dari Perl 5.22 di perpustakaan Hash::Util fungsi muncul bucket_stats_formatted, berikut ini contoh penggunaannya:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

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

print bucket_stats_formatted(\%h);

Output dari program ini:

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

Artikel lainnya