Как определить, содержит ли хэш 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};
}