2010-01-11 20 views
72

acabo He estado usando este código para comprobar si una cadena está vacía:¿Cuál es la forma correcta de verificar si una cadena está vacía en Perl?

if ($str == "") 
{ 
    // ... 
} 

Y también lo mismo con el operador no es igual ...

if ($str != "") 
{ 
    // ... 
} 

Esto parece funcionar (I pensar), pero no estoy seguro de que sea la forma correcta, o si hay algún inconveniente imprevisto. Algo simplemente no se siente bien al respecto.

Respuesta

106

Para las comparaciones de cadenas en Perl, utilice eq o ne:

if ($str eq "") 
{ 
    // ... 
} 

Los == y != operadores son numéricos operadores de comparación. Intentarán convertir ambos operandos a enteros antes de compararlos. Para obtener más información, visite la página del manual perlop.

+0

Sí, usando esto, sin embargo es necesario ser cauteloso que si es undef, y si usted está utilizando advertencias le Recibirá una advertencia de tiempo de ejecución. Sin embargo, muchas formas de evitar la advertencia. –

2

El concepto mismo de una forma "adecuada" de hacer cualquier cosa, además de usar CPAN, no existe en Perl.

De todas formas esas son operadores numéricos, se debe utilizar

if($foo eq "") 

o

if(length($foo) == 0) 
+3

Es cierto que Perl no tiende a defender la "única y verdadera manera" de resolver problemas, pero eso no significa que no haya expresiones idiomáticas, estilos y enfoques muy preferidos.Además, como a uno de los clientes habituales de Perl le gusta decir mucho, incluso si hay más de una forma de hacer las cosas, * algunas * formas de hacer las cosas son muy, muy malas (estúpidas, desacertadas, difíciles de mantener) , etc.) – Telemachus

+2

El hecho de que haya muchas maneras de hacerlo no significa que todas las formas sean iguales. La prueba de cadenas vacías usando 'if ($ foo ==" ")', por ejemplo, * es definitivamente incorrecta * a menos que realmente pretenda probar si '$ foo', evaluado en contexto numérico, tiene un valor de 0 (en cuyo caso sería * todavía * mejor escrito como 'if ($ foo == 0)', ya que eso expresa más claramente tu intención). –

9

Es posible que desee utilizar "eq" en lugar de "==". Si te preocupas por algunos casos extremos es posible que también desee comprobar para indefinida:

if (not defined $str) { 

# this variable is undefined 

} 
+1

Muy útil cuando obtuviste la cuerda mediante el desplazamiento de una matriz que puede tener 0 elementos. – Dacav

9

Como ya se ha mencionado por varias personas, eq es el operador de aquí.

Si use warnings; en su secuencia de comandos, recibirá advertencias acerca de esto (y muchas otras cosas útiles); Yo recomendaría use strict; también.

+0

+1 Genial, sí, normalmente uso 'use strict' pero estoy actualizando un código viejo, así que cuando agrego esto recibo cientos de errores. Probablemente los arregle algún día. –

82
  1. Debido a la forma en que se almacenan las cadenas en Perl, se optimiza la longitud de una cadena.
    if (length $str) es una buena manera de verificar que una cadena no esté vacía.

  2. Si se encuentra en una situación en la que aún no ha guardado contra undef, entonces el catch-all para "no vacío" que no avisará es if (defined $str and length $str).

+3

Creo que la longitud es la prueba más cercana que tenemos a la expresión de la idea de que no hay nada en la cadena. –

+3

Upvoted porque 'if (length ($ str))' es un buen enfoque y no falla si la variable no está definida. – basic6

0

para comprobar si hay una cadena vacía también se puede hacer algo de la siguiente manera

if (!defined $val || $val eq '') 
{ 
    # empty 
} 
Cuestiones relacionadas