我需要确定Perl哈希是否具有给定密钥,但该密钥将映射到undef值。具体来说,这样做的动机是在使用带有散列引用的getopt()
时传入布尔标志。我已经搜索了这个网站和谷歌,exists()
和defined()
似乎不适用于这种情况,他们只是看看给定密钥的值是否未定义,他们不会检查哈希是否确实有密钥。如果我是RTFM,请指出解释此问题的手册。
答案 0 :(得分:26)
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 perl
或在{{1}}获取所有perldoc的完整索引。 http://perldoc.perl.org 子>
答案 1 :(得分:11)
如果我正确地阅读了你的问题,我认为你对exists感到困惑。来自文档:
存在EXPR
给出一个指定a的表达式 哈希元素或数组元素,返回 如果指定的元素在,则返回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};
}
答案 2 :(得分:6)
简短回答:
if ( exists $hash{$key} and not defined $hash{$key} ) {
...
}