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

11

我需要确定一个Perl哈希表是否有一个给定的键,但这个键将被映射到未定义值。具体而言,我想在使用getopt()时查看布尔标志,该函数接受一个传递进来的哈希引用。我已经在这个网站和谷歌上进行了搜索,但是exists()defined()似乎不适用于此情况,它们只能检查给定键的值是否未定义,而不能检查哈希表是否实际存在该键。如果我犯了文献阅读不足的错误,请指出解释此问题的手册。

3个回答

28

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} 存在: 是的
$hash{key1} 已定义: 是的
$hash{key2} 存在: 是的
$hash{key2} 已定义: 不是的
$hash{key3} 存在: 不是的
$hash{key3} 已定义: 不是的

这两个函数的文档可以在命令行中使用perldoc -f definedperldoc -f exists查看(或者阅读所有方法的文档perldoc perlfunc*). 官方网站文档在此处:

*既然你特别提到了RTFM(读文档),可能你不知道Perl文档的位置,所以我也想指出你可以在perldoc perlhttp://perldoc.perl.org获取所有perldocs的完整索引。


11

如果我正确理解您的问题,我认为您对exists函数有些困惑。从文档中可以看到:

exists EXPR

给定一个指定哈希元素或数组元素的表达式,如果哈希或数组中指定的元素曾被初始化过(即使其相应的值为未定义),则返回 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};
}

6

简短回答:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接