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

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

Вопрос

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

Это было полезно?

Решение

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 (или ознакомьтесь с документацией по всем методам на perldoc perlfunc*).Официальная веб-документация находится здесь:

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

Другие советы

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

существует ВЫРАЖЕНИЕ

Учитывая выражение, которое определяет элемент хэша или элемент массива, возвращает 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} ) {
    ...
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top