如何确定Perl哈希是否包含映射到未定义值的键?

时间:2010-01-23 22:17:23

标签: perl hash key exists defined

我需要确定Perl哈希是否具有给定密钥,但该密钥将映射到undef值。具体来说,这样做的动机是在使用带有散列引用的getopt()时传入布尔标志。我已经搜索了这个网站和谷歌,exists()defined()似乎不适用于这种情况,他们只是看看给定密钥的值是否未定义,他们不会检查哈希是否确实有密钥。如果我是RTFM,请指出解释此问题的手册。

3 个答案:

答案 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 definedperldoc -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} ) {
    ...
 }