Cómo comprobar que en el Perl de la variable contiene undef

La tarea. En el código en el lenguaje de programación Perl es variable. Es necesario comprobar es si el valor de esta variable undef o no.

La solución

En la variable contiene undef sólo si la función de defined para esta variable devuelve false. He aquí el código que se muestra en el texto si la variable contiene undef:

▶ Run
#!/usr/bin/perl

my $foo;

if ( !defined($foo) ) {
    print "foo is undef";
}

Las malas decisiones

Para comprobar si undef en la variable debe utilizar defined. Pero a menudo que para comprobar undef utilizan otros métodos incorrectos.

He aquí el primer ejemplo de cómo no se debe hacer:

▶ Run
#!/usr/bin/perl

my $foo;

if ( !$foo ) { # error!
    print "foo is undef";
}

Este ejemplo realmente mostrará una línea de foo is undef si la variable de $foo contiene el valor de la undef, pero el código mostrará esta línea y en otros casos. Por ejemplo, si en $foo contiene el número de 0 o la cadena vacía ''. Este código no es la comprobación de que en $foo contiene undef, y la comprobación de que en $foo contiene el valor de la mentira, y no es lo mismo que undef.

He aquí otro ejemplo de una errónea de verificación en undef:

▶ Run
#!/usr/bin/perl

my $foo;

if ( $foo == undef ) { # error!
    print "foo is undef";
}

Aquí directamente todos muy mal. Si en la variable $foo contiene el valor de la undef, este código mostrará la línea foo is undef, pero el código de los sacará de esta línea y en otros casos. Por ejemplo, si en la variable $foocontiene la cadena de 'Hello'.

El operador de == está diseñado para comparar números. Antes de realizar la comparación de esta instrucción convierte sus argumentos en los números. La variable $foo en la que se encuentra undef se convierte en el número de 0. Y undef a la derecha del operador también se convierte en el número de 0. Cero es igual a cero, la condición se dispara. Pero el cero son algunas de las filas, por ejemplo 'Hello'.

Si se agrega en este código use strict; y use warnings;, el Perl mostrará una línea de foo is undef, pero así mismo, informará sobre lo que esta pasando algo extraño:

Use of uninitialized value in numeric eq (==) at script.pl line 8.
Use of uninitialized value $foo in numeric eq (==) at script.pl line 8.
foo is undef

Y en general, siempre es una muy buena práctica utilizar siempre use strict; y use warnings;.

Temas relacionados

Otros articulos