我需要确定 Perl 哈希是否具有给定键,但该键将映射到 undef 值。具体来说,这样做的动机是查看布尔标志在使用时是否getopt()
与传递给它的哈希引用一起使用。我已经搜索了这个网站和谷歌,并且exists()
似乎defined()
不适用于这种情况,他们只是查看给定键的值是否未定义,他们不检查哈希是否真的有键。如果我在这里是 RTFM,请指向解释这一点的手册。
问问题
25452 次
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 defined
并且perldoc -f exists
(或阅读所有方法的文档perldoc perlfunc
*)。官方网络文档在这里:
*由于您特别提到了 RTFM,并且您可能不知道 Perl 文档的位置,因此我还要指出,您可以perldoc perl
在 http://perldoc.perl.org 或http://perldoc.perl.org上获得所有 perldocs 的完整索引。
于 2010-01-23T23:09:21.143 回答
11
如果我正确阅读了您的问题,我认为您对存在感到困惑。从文档中:
存在 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};
}
于 2010-01-23T22:31:48.790 回答
6
简短的回答:
if ( exists $hash{$key} and not defined $hash{$key} ) {
...
}
于 2010-01-24T02:12:13.840 回答