Мне нужно определить, имеет ли хэш Perl заданный ключ, но этот ключ будет сопоставлен со значением undef. В частности, мотивация для этого заключается в том, чтобы видеть, есть ли логические флаги при использовании getopt() с переданной в него хеш-ссылкой. Я уже искал и этот сайт, и Google, и exists() и defined(), похоже, не подходят для этой ситуации, они просто видят, не определено ли значение для данного ключа, они не проверяют, действительно ли хеш ключ. Если я здесь RTFM, пожалуйста, укажите мне на руководство, в котором это объясняется.
Как я могу определить, содержит ли хеш Perl сопоставление клавиш с неопределенным значением?
Ответы (3)
exists () и defined () не подходят для данной ситуации, они просто видят, является ли значение для данного ключа undefined, они не проверяют, действительно ли у хеша есть ключ
Неправильно. Это действительно то, что делает 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.
Если я правильно прочитал ваш вопрос, я думаю, вы не понимаете, что существует. Из документации:
существует 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};
}
Короткий ответ:
if ( exists $hash{$key} and not defined $hash{$key} ) {
...
}