Perl Hash im skalaren Kontext

Manchmal bei der Arbeit mit хешами können Sie sehen einige seltsame Brüche.

Hier ist das Beispielprogramm:

#!/usr/bin/perl

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

print "hash: " . %h;

Wenn dieses Programm auf Perl Version 5.22 ist die Ausgabe dieses Programms wird der Text hash: 2/8.

Was ist das für ein Bruch?

Bei der Verwendung der Punkt-Operator Hash wird im skalarkontext. print "hash: " . %h; ist das gleiche dass und print "hash: " . scalar(%h);

Zeile 2/8 — es ist das Ergebnis des Ausdrucks scalar(%h).

Zeile 2/8 spricht über die innere Einrichtung Hash. Diese Statistik Nutzung бакетов. Dies ist eine völlig interne Küche, die sehr selten benötigt. Innerhalb der Hash аллоцируются spezielle Abschnitte unter dem Titel buckets, in denen die Daten gespeichert sind. Dann steht rechts vom Bruch ist eine Zahl аллоцированных бакетов. Die Anzahl der Links von Brüchen ist die Anzahl der tatsächlich verwendeten бакетов. Beim hinzufügen Paare von Werten in der Hash irgendwann die Anzahl der аллоцированных бакетов erhöht, um den Hash gearbeitet effektiv.

Hier ist ein Beispielprogramm, das zeigt, wie sich diese zahlen beim hinzufügen von Werten in einem Hash:

#!/usr/bin/perl

use feature qw(say);

my %h;

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

Hier ist die Ausgabe dieses Programms (bitte beachten Sie, dass nicht jedes mal, wenn Sie einen Wert im Hash erhöht die Anzahl der verwendeten бакетов):

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

Es ist interessant, dass diese zahlen unbeständig. Wenn ein paar mal starten das Perl-Skript ist die Ausgabe ein wenig variieren.

Die Veränderung der Arbeit ab 5.26 Perl

Interne Statistik der Hash nur selten brauche. Deshalb Perl ab der Version 5.26 Verhalten Hash in Skalar-den Kontext geändert wurde. Jetzt Hash im skalaren Kontext liefert die Anzahl der — Anzahl der Paare von Elementen in хеше. Und ehrlich gesagt, es ist alles genau und erwarten, dass man sich an хешу im skalarkontext.

Bis Perl Version 5.26, um die Anzahl der Paare von Elementen in хеше schreiben musste scalar(keys(%h));. Perl ab Version 5.26 jetzt die gleiche Anzahl können Sie mit einer scalar(%h);.

Aber wenn jemand brauchen, um gerade den Bruch mit der Statistik auf хешу zu machen, kann es mit Hilfe Funktionen bucket_ratio aus der Bibliothek Hash::Util. Hier ist ein Beispiel-Programm, das auf Perl Version 5.26 zeigt Text hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

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

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

Zusätzliche Statistiken über хешу

Wenn alle das so verstehen müssen, was passiert mit хешом, dann können auch andere Werkzeuge. Perl ab Version 5.22 in der Bibliothek Hash::Util gab es eine Funktion bucket_stats_formatted, hier ein Beispiel die Verwendung:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

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

print bucket_stats_formatted(\%h);

Die Ausgabe dieses Programms:

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

Andere Artikel