2012-02-21 7 views
10

Me doy cuenta de que la evaluación de una matriz en Perl en un contexto escalar es útil: da como resultado un # de elementos.¿Cuál es la razón para evaluar un hash en Perl en un contexto escalar?

Pero, ¿cuál es el uso práctico de poder evaluar un hash en un contexto escalar? p.ej.

  • my $scalar_value = %hash;

  • scalar(%hash)

Por lo que yo entiendo, que produce una cadena como "3/4" dar alguna información sobre el funcionamiento interno del hash que aparece sólo para ser útil para la depuración

+0

¿Cuál es la diferencia? –

+3

Una matriz es una variable con un símbolo '@', una lista es una serie de elementos en el código fuente. en este código '@array = (1, 2, 3)', '(1, 2, 3)' es una lista, y '@ array' es una variable de matriz. perlfaq4 contiene más información: http://perldoc.perl.org/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array? –

+1

¿Pero no puedo escribir 'escalar (1,2,3,4)'? si ese es el caso, entonces la "lista" era correcta según su declaración, ¿no? –

Respuesta

14

Produce un valor que se puede utilizar como un indicador VERDADERO/FALSO para saber si el hash está vacío (sin teclas).

Como un ejemplo:

if (%hash) { 
    print "Hash has elements\n"; 
} else { 
    print "Hash is empty\n"; 
} 

if fuerza a la expresión en un contexto escalar debido a su uso como una expresión booleana.

Es un concepto muy similar al uso @array en un contexto escalar a prueba de vacío:

if (@array) { 
    # NOT empty! 
} 
+0

Donde "vacío" significa "no tiene teclas". – tchrist

+0

@tchrist: agregué eso como aclaración, pero estoy en una ligera pérdida en cuanto a cómo se puede interpretar el "hash vacío". – DVK

+3

Es porque las personas se preguntan si '% h = (foo => undef)' significa algo diferente como un escalar. Lo mismo ocurre con los bichos raros sobre '@a = (undef)'. Cada uno de ellos tiene un índice válido, aunque no tiene un valor válido. Entonces es su conteo de claves lo que cuenta. – tchrist

1

El escalar (% hash) le permite comprobar si el algoritmo de hash está funcionando correctamente. Si tiene 1,000 teclas y ve algo así como 2/16 eso significa que todas las teclas se están resolviendo en solo 2 de los 16 espacios asignados. Esto significa que todas sus claves son muy similares y causan muchas colisiones, lo que da como resultado largas búsquedas secuenciales en el depósito.

cubo por defecto recuento es 8

perl -le '$h{a}=1;print scalar %h' 
1/8 

Prestash el hash con 1000 cubos (a la potencia más cercana a 2)

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h' 
1/1024 

Esto también ayuda cuando bendices un hash para OO Perl. Puedes acelerar las cosas si sabes que habrá muchas llaves.

Cuestiones relacionadas