Perl hash en el contexto de la скалярном

A veces, cuando se trabaja con los hashes se puede ver algunos extraños de la fracción.

He aquí un ejemplo de programa:

#!/usr/bin/perl

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

print "hash: " . %h;

Si ejecuta este programa en versión de Perl 5.22, la salida de este programa será el texto hash: 2/8.

Qué es una fracción?

Cuando se utiliza el operador punto de hash se utiliza en скалярном contexto. print "hash: " . %h; es lo mismo que print "hash: " . scalar(%h);

La cadena de 2/8 es el resultado de un trabajo de expresión scalar(%h).

La cadena de 2/8 informa sobre el funcionamiento interno de hash. Esta es la estadística de uso de бакетов. Es totalmente interior de la cocina, que es muy rara vez es necesaria. Dentro de hash аллоцируются secciones especiales bajo el nombre de бакеты, en el que se almacenan los datos. Lo que se encuentra a la derecha de la fracción es el número de аллоцированных бакетов. El número a la izquierda de la fracción es el número que realmente se usan бакетов. Cuando se agrega los pares de valores en el hash en algún momento el número de аллоцированных бакетов aumenta para los hash trabajado efectivamente.

He aquí un ejemplo de un programa que muestra cómo cambia estas cifras agregar valores de hash:

#!/usr/bin/perl

use feature qw(say);

my %h;

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

Aquí está la salida de este programa (tenga en cuenta que no cada vez que se agrega el valor de hash aumenta el número 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

Es interesante que estas cifras son variables. Si varias veces ejecutar este script en Perl, la salida será un poco diferente.

El cambio de trabajo a partir del Perl 5.26

Estadísticas internas de hash necesita exclusivamente en raras ocasiones. Por lo tanto, a partir de la versión de Perl 5.26 comportamiento de hash en скалярном el contexto ha cambiado. Ahora el hash en скалярном el contexto devuelve el número es el número de pares de elementos en хеше. Y, francamente, eso es todo y esperan obtener dirigiéndose a хешу en скалярном contexto.

Antes de la versión de Perl 5.26 para obtener el número de pares de elementos en хеше era necesario escribir scalar(keys(%h));. A partir de la versión de Perl 5.26 ahora mismo número se puede obtener con la ayuda de scalar(%h);.

Pero si alguien necesita obtener exactamente la fracción con las estadísticas de хешу, puede hacerlo con la ayuda de la función de bucket_ratio de la biblioteca de Hash::Util. He aquí un ejemplo de un programa que en la versión de Perl 5.26 muestra el texto hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

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

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

Más de las estadísticas de хешу

Si las necesita entender lo que está ocurriendo con хешом, puede utilizar otras herramientas. A partir de la versión de Perl 5.22 en la biblioteca Hash::Util es la función bucket_stats_formatted, he aquí un ejemplo su uso:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

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

print bucket_stats_formatted(\%h);

La salida de este programa:

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

Otros articulos