tutorial strawberry logo historia example perl

perl - strawberry - ¿Qué obtienes si evalúas un hash en contexto escalar?



perl tutorial (4)

Concentrarse demasiado en este patrón fraccionario (como un indicador de los detalles internos del hash) puede ser confuso. Hay un aspecto del "valor escalar" de un hash que es importante para potencialmente cada programa Perl y es decir, si se considera verdadero en contexto booleano , vea un ejemplo:

if (%h) { print "Entries in hash:/n"; for my $k (sort keys %h) { print "$k: $h{$k}/n"; } }

En perldoc perldata , sección Valores escalares , puede leer eso

[...] El contexto booleano es solo un tipo especial de contexto escalar donde nunca se realiza la conversión a una cadena o un número.

y, algunos párrafos después,

Si evalúa un hash en contexto escalar, devuelve falso si el hash está vacío. Si hay pares de clave / valor, devuelve verdadero [...]

Considere el siguiente fragmento:

use strict; use warnings; my %a = ( a => 1, b => 2, c => ''cucu'', d => undef, r => 1, br => 2, cr => ''cucu'', dr => ''321312321'', ); my $c = %a; print $c;

El resultado de esto es 5/8 y no entiendo lo que esto representa. Leí en alguna parte que un número de este resultado de aspecto de fracción podría representar la cantidad de cubos del hash, pero claramente este no es el caso.

¿Alguien sabe cómo se evalúa un hash de Perl en contexto escalar?

Editar

Agregué algunos otros hashes para imprimir:

use strict; use warnings; use 5.010; my %a = ( a => 1, b => 2, c => ''cucu'', d => undef, r => 1, br => 2, cr => ''cucu'', dr => ''321312321'', ); my $c = %a; say $c; # 5/8 %a = ( a => 1, b => 21, c => ''cucu'', br => 2, cr => ''cucu'', dr => ''321312321'', ); $c = %a; say $c; # 4/8 %a = ( a => 1, b => 2, c => ''cucu'', d => undef, r => 1, br => 2, cr => ''cucu'', dr => ''321312321'', drr => ''32131232122'', ); $c = %a; say $c; #6/8

Entonces, ¿llamas a una ''tupla'' como a => 1 un cubo en el hash? en ese caso, ¿por qué el último hash todavía tiene 8 como denominador cuando tiene 9 ''tuplas''?

Gracias a todos por sus respuestas hasta ahora :)


De perldoc perldata :

Si evalúa un hash en contexto escalar, devuelve falso si el hash está vacío. Si hay pares clave / valor, devuelve verdadero; más precisamente, el valor devuelto es una cadena que consiste en la cantidad de segmentos usados ​​y el número de segmentos asignados, separados por una barra oblicua.

En su caso, tiene cinco valores ( 1 , 2 , ''''cucu'' , undef y ''321312321'' ) que se han correlacionado con ocho teclas ( a , b , c , d , r , br , cr y dr )


La cantidad de cubos usados ​​comienza aproximadamente por el número de claves; Buckets asignados es consistentemente la potencia más baja de 2> la cantidad de claves. 5 teclas devolverán 5/8. Los números más grandes de claves únicas crecen más lentamente, de modo que un hash% h que es solo la lista (1..128), con 64 pares de clave / valor, de alguna manera obtiene un valor escalar de 50/128.

Sin embargo, una vez que el hash ha asignado sus segmentos, seguirán asignados incluso si reduce el hash. Acabo de hacer un hash% h con 9 pares, por lo tanto 9/16 escalar; luego, cuando reasigné% h para tener solo un par, su valor escalar fue 1/16.

Esto realmente tiene sentido ya que te permite probar el tamaño del hash, como lo hace un escalar de una matriz simple.


Un hash es una matriz de listas enlazadas. Una función de hash convierte la clave en un número que se utiliza como el índice del elemento de la matriz ("cubo") en el que almacenar el valor. La lista vinculada maneja el caso donde más de una clave se hereda con el mismo índice ("colisión").

El denominador de la fracción es el número total de cubos.

El numerador de la fracción es el número de cubos que tiene uno o más elementos.

Para hash con el mismo número de elementos, cuanto mayor sea el número, mejor. El que devuelve 6/8 tiene menos colisiones que el que devuelve 4/8.