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

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

8
задан brian d foy 25 January 2010 в 17:19
поделиться

3 ответа

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

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

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.

27
ответ дан 5 December 2019 в 04:41
поделиться

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

существует EXPR

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

Например:

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};
}
11
ответ дан 5 December 2019 в 04:41
поделиться

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

 if ( exists $hash{$key} and not defined $hash{$key} ) {
    ...
 }
6
ответ дан 5 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: