¿Cómo puedo determinar si un hash de Perl contiene una asignación de teclas a un valor indefinido?

StackOverflow https://stackoverflow.com/questions/2124977

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.

¿Fue útil?

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} ) {
    ...
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top