【问题标题】:How can I determine if a Perl hash contains a key mapping to an undefined value?如何确定 Perl 哈希是否包含到未定义值的键映射?
【发布时间】:2011-01-08 15:49:51
【问题描述】:
我需要确定一个 Perl 散列是否有一个给定的键,但是那个键将被映射到一个 undef 值。具体来说,这样做的动机是在使用 getopt() 时查看布尔标志是否传递了哈希引用。我已经搜索了这个网站和谷歌,exists() 和 defined() 似乎不适用于这种情况,他们只是查看给定键的值是否未定义,他们不检查是否哈希实际上有密钥。如果我是这里的 RTFM,请指向解释这一点的手册。
【问题讨论】:
标签:
perl
hash
key
exists
defined
【解决方案1】:
简答:
if ( exists $hash{$key} and not defined $hash{$key} ) {
...
}
【解决方案2】:
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 或 @987654323 获得所有 perldocs 的完整索引@.
【解决方案3】:
如果我没看错你的问题,我认为你对exists 感到困惑。来自文档:
存在 EXPR
给定一个表达式,指定一个
哈希元素或数组元素,返回
如果指定元素在
哈希或数组曾经
初始化,即使对应的
值未定义。
例如:
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};
}