¿Cómo puedo determinar si un hash de Perl contiene una asignación de teclas a un valor indefinido?
Pregunta
necesito para determinar si un hash de Perl tiene una clave determinada, pero esa clave se asignará a un valor no def. En concreto, la motivación para esto es ver si las banderas booleanas durante el uso de getopt()
con una referencia a un hash pasado a él. Ya he buscado tanto en este sitio y Google, y exists()
y defined()
no parecen ser aplicables a la situación, que acaba de ver si no está definido el valor de una clave dada, no comprobar si el hash en realidad tiene la llave. Si un RTFM aquí, por favor que me señale el manual que explica esto.
Solución
existe () y define () no parecen ser aplicables a la situación, que acaba de ver si no está definido el valor de una clave dada, no comprobar si el hash en realidad tiene la clave
incorrecta. Eso es precisamente lo que hace defined()
, pero exists()
hace exactamente lo que quiere:
my %hash = (
key1 => 'value',
key2 => undef,
);
foreach my $key (qw(key1 key2 key3))
{
print "\$hash{$key} exists: " . (exists $hash{$key} ? "yes" : "no") . "\n";
print "\$hash{$key} is defined: " . (defined $hash{$key} ? "yes" : "no") . "\n";
}
produce:
$hash{key1} exists: yes $hash{key1} is defined: yes $hash{key2} exists: yes $hash{key2} is defined: no $hash{key3} exists: no $hash{key3} is defined: no
La documentación de estas dos funciones se encuentra disponible en la línea de comandos en perldoc -f defined
y perldoc -f exists
(o leer la documentación de todos los métodos en perldoc perlfunc
*). La documentación oficial web es aquí:
* Ya que menciona específicamente RTFM y puede que no sea consciente de la ubicación de la documentación de Perl, también quisiera señalar que se puede obtener un índice completo de todos los perldocs en perldoc perl
o al http://perldoc.perl.org .
Otros consejos
Si estoy leyendo bien su pregunta, creo que usted está confundido acerca de existe . A partir de la documentación:
existe EXPR
Dada una expresión que especifica una elemento de hash o elemento de la matriz, devoluciones cierto si el elemento especificado en el picadillo o matriz ha sido nunca inicializado, incluso si el correspondiente valor es indefinido.
Por ejemplo:
use strict;
use warnings;
my %h = (
foo => 1,
bar => undef,
);
for my $k ( qw(foo bar baz) ){
print $k, "\n" if exists $h{$k} and not defined $h{$k};
}
Breve respuesta:
if ( exists $hash{$key} and not defined $hash{$key} ) {
...
}