¿Puede undef ser la clave hash en Perl?

La respuesta es no.

undef no puede ser la clave hash en Perl. Pero hay sutilezas que puede dar la impresión de que puede. Los detalles a continuación.

¿Qué es el hash

Una de las estructuras de datos que existe en el lenguaje de programación Perl es un hash. El hash es un desordenado conjunto de pares de valores. He aquí un ejemplo de un hash:

my %h = (
    aa => 1,
    bb => 2,
);

En este хеше se almacena dos pares de valores. En la clave con el nombre de 'aa' se almacena el valor de 1, y en la clave con el nombre de 'bb' se almacena el valor de 2. Para conseguir estos valores se utilizan la sintaxis de $h{aa} y $h{bb}.

¿Qué es undef

undef es un valor especial en Perl, que significa la ausencia de valores. Si crear una variable, pero no asignarle ningún valor, entonces su valor será tanto más undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

El programa mostrará en pantalla el texto $VAR1 = undef;.

undef todavía se puede conseguir si dirigirse a un elemento de una matriz o a una clave en хеше. Puede asignar explícitamente undef de la variable: $var = undef;.

La errónea utilización 1

He aquí un ejemplo de un programa desde el que parece que undef puede ser la clave hash:

▶ Run
#!/usr/bin/perl

my %h = (
    undef => 'asdf',
);

print $h{undef};

El programa muestra en pantalla el texto asdf. Es decir, como si la hemos creado en хеше clave undef, luego han sacado el valor de esta clave. Pero no es así. En este ejemplo, el valor se almacena en la clave de 'undef', es decir, la cadena de 'undef', y no un undef.

Esto se debe a dos características.

Cuando se crea un hash que hemos creado en él un par clave-valor mediante el código de undef => 'asdf',. En este código, se utiliza el operador de =>. Una característica de esta el operador en el hecho de que en algunas situaciones se puede percibir lo que está a la izquierda como una cadena. Él, como si estuviera concluye que se encuentra a la izquierda de => entre comillas. undef => 'asdf', es en realidad 'undef' => 'asdf',.

La segunda característica es ¿cómo quitar el valor de hash de la clave. Utilizamos la sintaxis $h{undef}. Y aquí Perl considera que lo que está en paréntesis es una cadena. Lo que podemos escribir lo mismo que $h{'undef'}.

Puede asegurarse de que esto es realmente así si ejecutar el script, conectando el módulo especial de la que lugar de ejecución de código que muestra como Perl entiende este código. perl -MO=Deparse script.pl. He aquí la conclusión:

my(%h) = ('undef', 'asdf');
print $h{'undef'};
script.pl syntax OK

La errónea utilización de 2

He aquí otro ejemplo de código desde el que erróneamente parece que undef puede ser la clave hash. Realmente es algo utilizamos el presente undef, y no la línea 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

my %h = (
    $var => 'asdf',
);

print $h{$var};

El programa muestra en pantalla el texto asdf. Es decir, parece que nos hemos creado el valor en хеше por la clave de la undef.

Pero, en realidad, hemos hecho que el valor de la clave '' (cadena vacía). Si de añadir al final de este programa de la cadena use Data::Dumper y warn Dumper \%h;, después de iniciar en la pantalla se ve como en realidad se ve hash:

$VAR1 = {
          '' => 'asdf'
        };

La variable $var contiene en sí mismo el valor de undef, pero cuando se usa en $var => 'asdf', y $h{$var} undef se sustituye por una cadena vacía ''.

Si se agrega en el código de use strict; y use warnings; (que casi siempre vale la pena hacerlo), lo en la salida del programa se ve que el Perl advierte acerca de este uso:

Use of uninitialized value $var in list assignment at script.pl line 8.
Use of uninitialized value $var in hash element at script.pl line 12.

Resumen

undef no puede ser un valor de la clave en Perl хеше. Las claves en Perl хеше es siempre la línea. (Aclaración sólo que la cadena vacía '' también puede ser la clave). Y los valores en хеше pueden ser completamente todas y allí sin problemas puede ser undef.

Otros articulos