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