Как я могу определить, содержит ли хеш Perl отображение ключа на неопределенное значение? - PullRequest
7 голосов
/ 24 января 2010

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

Ответы [ 3 ]

26 голосов
/ 24 января 2010

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

Неправильно. Это действительно то, что 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, позвольте мне также указать, что вы можете получить полный индекс всех perldocs на perldoc perl или http://perldoc.perl.org.

11 голосов
/ 24 января 2010

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

существует EXPR

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

Например:

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};
}
6 голосов
/ 24 января 2010

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

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