我需要确定一个Perl哈希表是否有一个给定的键,但这个键将被映射到未定义值。具体而言,我想在使用getopt()
时查看布尔标志,该函数接受一个传递进来的哈希引用。我已经在这个网站和谷歌上进行了搜索,但是exists()
和defined()
似乎不适用于此情况,它们只能检查给定键的值是否未定义,而不能检查哈希表是否实际存在该键。如果我犯了文献阅读不足的错误,请指出解释此问题的手册。
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 defined
和perldoc -f exists
查看(或者阅读所有方法的文档perldoc perlfunc
*). 官方网站文档在此处:
*既然你特别提到了RTFM(读文档),可能你不知道Perl文档的位置,所以我也想指出你可以在perldoc perl
或http://perldoc.perl.org获取所有perldocs的完整索引。
如果我正确理解您的问题,我认为您对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};
}
简短回答:
if ( exists $hash{$key} and not defined $hash{$key} ) {
...
}