Como posso determinar se um hash Perl contém um mapeamento de chave para um valor indefinido?
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.
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} ) {
...
}