Как определить, содержит ли хэш Perl сопоставление ключа с неопределенным значением?

мне нужно определить, имеет ли хэш Perl данный ключ, но этот ключ будет сопоставлен со значением undef. В частности, мотивацией для этого является просмотр логических флагов при использовании getopt() с хэш-ссылкой, переданной в него. Я уже искал как этот сайт, так и google, и exists() и defined() Кажется, не применимы к ситуации, они просто видят, если значение для данного ключа не определено, они не проверяют, действительно ли хэш имеет ключ. Если я RTFM здесь, пожалуйста покажите мне руководство, которое объясняет это.

3 ответов


exists () и defined (), похоже, не применимы к ситуации, они просто видят, что значение для данного ключа не определено, они не проверяют, действительно ли хэш имеет ключ

неправильные. Это действительно то, что defined(), но exists() делает именно то, что вы хотите:

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

выдает:

$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

документация по этим двум функциям доступна в командной строке по адресу perldoc -f defined и perldoc -f exists (или прочитать документация по всем методам at perldoc perlfunc*). Официальная веб-документация здесь:

*поскольку вы конкретно упомянули RTFM, и вы, возможно, не знаете о местоположении документации Perl, позвольте мне также отметить, что вы можете получить полный индекс всех perldoc в perldoc perl или в http://perldoc.perl.org.


Если я правильно читаю ваш вопрос, я думаю, что вы смущены . Из документации:

существует EXPR

задано выражение, указывающее хэш-элемент или элемент массива, возвращает true, если указанный элемент в хэш или массив когда-либо были инициализировано, даже если соответствующее значение не определено.

например:

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

короткий ответ:

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