2012-02-25 28 views
44

Utilizo el siguiente código para verificar si el hash está vacío. ¿Hay un método mejor y es seguro de usar?cómo verificar si un hash está vacío en perl

if (!keys %hash) { print "Empty";} 
+6

Si cree que su pregunta ha sido respondida, debe aceptar una respuesta haciendo clic en la marca de verificación a la izquierda de la misma. – TLP

Respuesta

77
if (%hash) 

funcionará bien.

De perldoc perldata:

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

+2

Parece mucho más lento que 'keys% hash'. – choroba

17

más simple:

if (!%hash) { 
    print "Empty"; 
} 

! impone un contexto escalar, y el hash evaluada en un contexto escalar devuelve:

  • false si hay cero teclas (no definidos en la documentación, pero experimentalmente devuelve 0

  • Una cadena que significa cuántos usado/asignado cubos se utilizan para llaves> 0, lo que, por supuesto, no es falso (por ejemplo, "3/6")

+0

No, no devuelve '" false "', que sería un valor verdadero. Devuelve cero. – Borodin

+0

@Borodin - comillas equivocadas. Fijo – DVK

20

No fue lo que causó a bug hashes atados en contexto escalar para volver siempre falsas. El error fue fixed in 5.8.5. Si le preocupa la compatibilidad con versiones anteriores, me quedaría con if(!keys %hash). De lo contrario, use if(!%hash) según lo recomendado por otros.

1

"Mejor" es un término subjetivo. Sin embargo, yo diría que el código que es más fácil de entender se puede describir como "mejor". Por esta razón, concluyo que !keys %hash es mejor, porque todos los que escriban código perl sabrán qué hace este código y qué funciona. !%hash es algo que al menos tendré que buscar para asegurarme si realmente funciona o si solo parece que funcionaría. (La razón es que el valor de retorno de un hash en el contexto escalar es bastante confuso mientras que el comportamiento de un conjunto en contexto escalar es muy conocido y se usa con frecuencia).

También, !keys %hash es save.

Así que no, no hay forma mejor o más segura de verificar si un hash está vacío.

Cuestiones relacionadas