Perl de hachage dans le contexte скалярном

Parfois, lorsque vous travaillez avec des hachages, vous pouvez voir une étrange fractions.

Voici un exemple de programme:

#!/usr/bin/perl

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

print "hash: " . %h;

Si vous exécutez ce programme sur la version de Perl 5.22, la sortie de ce programme sera le texte hash: 2/8.

Quelle est cette fraction?

Lors de l'utilisation de l'opérateur d'un point de hachage utilisé dans скалярном contexte. print "hash: " . %h; c'est la même chose que print "hash: " . scalar(%h);

La chaîne de 2/8 — c'est le résultat du travail de l'expression scalar(%h).

La chaîne de 2/8 raconte sur un dispositif interne de hachage. Ce sont les statistiques d'utilisation бакетов. C'est tout à fait cuisine interne, ce qui est très rarement nécessaire. À l'intérieur de hachage аллоцируются sections spéciales sous le nom de бакеты, dans lequel les données sont stockées. Ce qui est écrit à droite de la fraction est un nombre аллоцированных бакетов. Le nombre à gauche de la fraction est un nombre vraiment utilisés бакетов. Lors de l'ajout les couples de valeurs dans un hachage à un certain moment, le nombre de аллоцированных бакетов augmente de hachage a travaillé efficacement.

Voici un exemple de programme qui montre l'évolution de ces chiffres que l'ajout de valeurs dans un hachage:

#!/usr/bin/perl

use feature qw(say);

my %h;

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

Voici la conclusion de ce programme (veuillez noter que chaque fois que vous ajoutez de la valeur dans un hachage augmente le nombre de бакетов):

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

Il est intéressant que ces chiffres sont inconstants. Si plusieurs fois d'exécuter ce script Perl, alors la sortie sera un peu différente.

Le changement de travail depuis Perl 5.26

Des statistiques internes de hachage besoin que rarement. Donc, à partir de la version de Perl 5.26 le comportement de hachage dans скалярном le contexte a changé. Maintenant de hachage dans le скалярном le contexte renvoie le nombre de paires d'éléments dans le hachage. Et, honnêtement, c'est tout cela et s'attendent à obtenir en s'adressant au хешу dans скалярном le contexte.

Jusqu'à la version de Perl 5.26 afin d'obtenir le nombre de paires d'éléments dans le hachage écrire scalar(keys(%h));. À partir de la version de Perl 5.26 maintenant, c'est le même nombre que vous pouvez obtenir à l'aide de scalar(%h);.

Mais si quelqu'un a besoin d'obtenir la fraction de la statistique sur хешу, il est possible de le faire par la fonction bucket_ratio de la bibliothèque Hash::Util. Voici un exemple de programme qui sur la version de Perl 5.26 affiche le texte hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

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

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

Autres statistiques de хешу

Si besoin de comprendre ce qui se passe avec хешом, vous pouvez utiliser d'autres outils. À partir de la version de Perl 5.22 dans la bibliothèque de Hash::Util la bucket_stats_formatted, voici un exemple son utilisation:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

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

print bucket_stats_formatted(\%h);

La conclusion de ce programme:

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

Autres articles