undef en Perl

undef en el lenguaje de programación Perl es uno de los valores que puede contener una variable. Si no se asigna un valor a una variable, en la variable se encuentra undef.

He aquí un ejemplo de Perl del programa:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $var;
print Dumper $var;

$var = 123;
print Dumper $var;

$var = undef;
print Dumper $var;

Este programa mostrará en pantalla:

$VAR1 = undef;
$VAR1 = 123;
$VAR1 = undef;

Primero hemos declarado la variable, pero no se apropió de ella ningún valor: my $var;. Continuar con print Dumper $var; sacado la informacin sobre la importancia de esta variable en la pantalla (se ve que en la variable contiene undef). Después de esto, hemos asignado a la variable número de 123y lo han demostrado en la pantalla. Y más con el código de $var = undef; hemos asignado a la variable undef y de nuevo sacado la información acerca de este.

undef puede ser un elemento de la matriz o el valor en хеше:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @arr = (1, undef, 'three');
print Dumper \@arr;

my %h = (
    a => undef,
);
print Dumper \%h;

A menudo undef se utiliza como un indicador. Por ejemplo, puede ser una característica, que siempre devuelve un número, pero en caso de error devuelve undef.

Nombre de la undef proviene de la palabra en inglés undefined("indefinido").

Que undef no es

undef es un valor. Esto no es una cadena de 'undef', no es una cadena vacía '' y no es el número de 0. Todo esto — valores diferentes.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $var (undef, 'undef', '', 0) {
    print Dumper $var;
}

En el caso de hash, si el valor de la clave undef no es lo mismo que en хеше no es la misma clave.

Cómo comprobar la undef

Para comprobar si el valor es undef se utiliza la función de defined. El valor es undef si la función defined devuelve false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if (!defined($var)) {
    print 'var is undef';
}

Es muy fácil escribir sabu is_undef, que devolverá la verdad si le entregaron undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;

sub is_undef {
    my ($maybe_undef) = @_;
    return !defined($maybe_undef);
}

my @arr = (1, undef, 'three');

foreach my $el (@arr) {
    say is_undef($el) ? 'undef' : 'not undef';
}

Pero más a menudo no se hace así, sino que utilizan la función de defined , sin ningún tipo de amarre.

Hay otra manera de cómo se puede verificar que en la variable contiene la undef es utilizar el operador ~~ (este operador se llama smartmatch). Este operador ha aparecido en Perl 5.10, pero a partir de la versión de Perl 5.18 el uso de este operador genera un mensaje de advertencia Smartmatch is experimental at script.pl line 8.. He aquí un ejemplo de código con este operador:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var ~~ undef) {
    print 'var is undef';
}

A menudo el mejor método para la prueba de undef es una función de defined.

Perl undef y la conversión en JSON

Biblioteca para trabajar con JSON en Perl convierten Perl valor undef en null en JSON:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use JSON::PP;

print encode_json {
    a => undef,
};

Este código mostrará {"a":null}.

Y viceversa, cuando se convierte de JSON null se convierte en undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use JSON::PP;
use Data::Dumper;

print Dumper decode_json '[null]';

Este código mostrará en la pantalla:

$VAR1 = [
          undef
        ];

La función de ref

El resultado de la operación de la función de ref con respecto a la undef es una cadena vacía ''. En este sentido, undef no es diferente de cadenas y números. Para undef, cadenas y números, la función de ref devuelve una cadena vacía:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $el ('asdf', undef, 100) {
    print Dumper ref($el);
}

Un valor booleano

Cuando se utiliza undef lógicas de las operaciones undef — es una mentira. Este código muestra la pantalla de texto false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

if (undef) {
    print 'true';
} else {
    print 'false';
}

El uso de cadenas

En caso de utilizar undef en las operaciones con cadenas de caracteres, en lugar de undefse utilizar una cadena vacía '', pero también se muestra un mensaje de advertencia.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print 'AAA' . $var . 'BBB';
▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var eq '') {
    print 'equal';
} else {
    print 'not equal';
}

En el primer caso, se muestra un mensaje de advertencia Use of uninitialized value in concatenation (.) or string at script.pl line 10., en el segundo caso, Use of uninitialized value in string eq at script.pl line 8..

El uso de números

En caso de utilizar undef en las operaciones con números, en lugar de undefse usado número de 0. pero de la misma manera se muestra un mensaje de advertencia.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var + 4;
▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var == 0) {
    print 'equal';
} else {
    print 'not equal';
}

En el primer caso, se muestra un mensaje de advertencia Use of uninitialized value $var in addition (+) at script.pl line 8., en el segundo caso, Use of uninitialized value $var in numeric eq (==) at script.pl line 8..

Es interesante que cuando se utiliza el operador incremental ++ advertencias no:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var++;

Temas relacionados

Otros articulos