2010-01-23 33 views
7

Necesito determinar si un hash Perl tiene una clave dada, pero esa clave se asignará a un valor undef. Específicamente, la motivación para esto es ver si boolean flags mientras usa getopt() con una referencia de hash pasada al mismo. Ya he buscado en este sitio y en google, y exists() y defined() no parecen ser aplicables para la situación, solo ven si el valor para una clave dada no está definido, no verifican si el hash en realidad tiene el llave. Si hago un RTFM aquí, remítame al manual que explica esto.¿Cómo puedo determinar si un hash Perl contiene una asignación de teclas a un valor indefinido?

Respuesta

26

existe() y definido() no parecen ser aplicables a la situación, que acaba de ver si el valor de una clave dada no está definido, se no compruebe si el hash realmente tiene la clave

Incorrecto. Eso es precisamente lo que defined() hace, 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 lea la documentación para 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 puede obtener un índice completo de todos los perldocs en perldoc perl o en http://perldoc.perl.org.

11

Si estoy leyendo su pregunta correctamente, creo que está confundido acerca de exists. A partir de la documentación:

existe EXPR

Dada una expresión que especifica un elemento de hash o elemento de la matriz, devuelve cierto si el elemento especificado en el de hash o conjunto siempre ha sido inicializado, incluso si el valor correspondiente no está definido.

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}; 
} 
6

Respuesta corta:

if (exists $hash{$key} and not defined $hash{$key}) { 
    ... 
} 
Cuestiones relacionadas