¿Cuál es la razón para evaluar un hash en Perl en un contexto escalar?
Pregunta
Me doy cuenta de que evaluar una matriz en Perl en un contexto escalar es útil: da como resultado un número de elementos.
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 tengo entendido, produce una cadena como "3/4
" que proporciona información sobre las partes internas del hash que parece ser solo útil para depurar.
Solución
Produce un valor que se puede usar como indicador VERDADERO / FALSO para saber si el hash está vacío (sin claves).
Como ejemplo:
if (%hash) {
print "Hash has elements\n";
} else {
print "Hash is empty\n";
}
if
fuerza la expresión a un contexto escalar debido a su uso como expresión booleana.
Es un concepto muy similar al uso de @array
en un contexto escalar para probar el vacío:
if (@array) {
# NOT empty!
}
Otros consejos
El escalar (% hash) le permite verificar si el algoritmo hash está funcionando correctamente.Si tiene 1,000 claves y ve algo como 2/16, eso significa que todas las claves se están resolviendo en solo 2 de los 16 depósitos asignados.Esto significa que todas sus claves son muy similares y causan muchas colisiones, lo que resulta en largas búsquedas secuenciales en el depósito.
El recuento de depósitos predeterminado es 8
perl -le '$h{a}=1;print scalar %h'
1/8
Prestash el hash con 1000 cubos (a la potencia más cercana de 2)
perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h'
1/1024
Esto también ayuda cuando bendices un hash por perl OO. Puede acelerar las cosas si sabe que habrá muchas claves.