Como posso determinar se um hash Perl contém um mapeamento de chave para um valor indefinido?

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

Pergunta

Preciso determinar se um hash Perl possui uma determinada chave, mas essa chave será mapeada para um valor undef.Especificamente, a motivação para isso é ver se os sinalizadores booleanos ao usar getopt() com uma referência hash passada para ele.Já pesquisei neste site e no Google e exists() e defined() não parecem ser aplicáveis ​​​​à situação, eles apenas veem se o valor de uma determinada chave é indefinido, não verificam se o hash realmente contém a chave.Se eu for um RTFM aqui, indique-me o manual que explica isso.

Foi útil?

Solução

existe() e definido() não parecem ser aplicáveis ​​à situação, eles apenas veem se o valor de uma determinada chave é indefinido, não verificam se o hash realmente possui a chave

Incorreta.Isso é realmente o que defined() faz, mas exists() faz exatamente o que você quer:

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

produz:

$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

A documentação para essas duas funções está disponível na linha de comando em perldoc -f defined e perldoc -f exists (ou leia a documentação para todos os métodos em perldoc perlfunc*).A documentação oficial da web está aqui:

*Como você mencionou especificamente o RTFM e pode não estar ciente da localização da documentação do Perl, deixe-me salientar também que você pode obter um índice completo de todos os perldocs em perldoc perl ou em http://perldoc.perl.org.

Outras dicas

Se estou lendo sua pergunta corretamente, acho que você está confuso sobre existe.Da documentação:

existe EXPR

Dada uma expressão que especifica um elemento de hash ou matriz, retorna true se o elemento especificado no hash ou matriz já tiver sido inicializado, mesmo que o valor correspondente seja indefinido.

Por exemplo:

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

Resposta curta:

 if ( exists $hash{$key} and not defined $hash{$key} ) {
    ...
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top