¿Cuál es la forma correcta de comprobar si una cadena está vacía en Perl?

95

Acabo de usar este código para verificar si una cadena está vacía:

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

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

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

Esto parece funcionar (creo), 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.

Nick Bolton
fuente

Respuestas:

134

Para comparaciones de cadenas en Perl, use eqo ne:

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

Los operadores ==y !=son operadores de comparación numéricos . Intentarán convertir ambos operandos a números enteros antes de compararlos.

Consulte la página del manual de perlop para obtener más información.

Greg Hewgill
fuente
Sí, al usar esto, debe tener cuidado de que si no está definido, y si está usando advertencias, recibirá una advertencia de tiempo de ejecución. Sin embargo, hay muchas formas de evitar la advertencia.
Evan Carroll
90
  1. Debido a la forma en que las cadenas se almacenan en Perl, se optimiza obtener la longitud de una cadena.
    if (length $str)es una buena forma de comprobar que una cadena no está vacía.

  2. Si se encuentra en una situación en la que aún no se ha protegido undef, entonces el truco para "no vacío" que no advertirá es if (defined $str and length $str).

hobbs
fuente
6
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.
brian d foy
6
Voto a favor porque if (length($str))es un buen enfoque y no falla si la variable no está definida.
básico 6 de
10

Probablemente desee utilizar "eq" en lugar de "==". Si le preocupan algunos casos extremos, es posible que también desee verificar si hay indefinidos:

if (not defined $str) {

# this variable is undefined

}
DmitryK
fuente
1
Muy útil cuando obtuvo la cadena cambiando de una matriz que puede tener 0 elementos.
Dacav
9

Como ya han mencionado varias personas, aquí eqes el operador adecuado.

Si está use warnings;en su secuencia de comandos, recibirá advertencias sobre esto (y muchas otras cosas útiles); Yo también lo recomiendo use strict;.

Matthew Slattery
fuente
+1 Genial, sí, normalmente lo uso, use strictpero estoy actualizando un código antiguo, así que cuando agrego esto, obtengo cientos de errores. Probablemente los arreglaré algún día.
Nick Bolton
4

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

De todos modos, esos son operadores numéricos, debe usar

if($foo eq "")

o

if(length($foo) == 0)
whatsisname
fuente
3
Es cierto que Perl no tiende a abogar por la "única manera verdadera" 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 realmente, muy malas (estúpidas, desacertadas, difíciles de mantener, etc. .)
Telémaco
2
El hecho de que haya muchas formas de hacerlo no significa que todas sean iguales. Probar cadenas vacías usando if ($foo == ""), por ejemplo, es definitivamente incorrecto a menos que realmente quiera probar si $foo, evaluado en contexto numérico, tiene un valor de 0 (en cuyo caso aún estaría mejor escrito como if ($foo == 0), ya que eso expresa más claramente su intención).
Dave Sherohman
0

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

if (!defined $val || $val eq '')
{
    # empty
}
Roland Ayala
fuente