之间有什么区别
if (defined $hash{$key}) { }
和
if (exists $hash{$key}) { }
我什么时候知道使用哪个?
答案 0 :(得分:92)
defined
和exists
的perldoc条目中详细记录了这一点。这是一个快速摘要:
defined $hash{key}
告诉您是否定义了给定键的值(即不是undef
)。用它来区分未定义的值和布尔上下文中的false值,例如0
和''
。
exists $hash{key}
告诉您%hash
是否包含给定的密钥。用它来区分未定义的值和不存在的值。
这是一个最简单的例子。鉴于此哈希:
my %hash = (a => 1, b => 0, c => undef);
以下是检索,定义和存在的结果:
# key value defined exists
a 1 1 1
b 0 1 1
c undef 0 1
d undef 0 0
在实践中,人们经常只写if ($hash{key}) {...}
,因为(在许多常见情况下)只有真正的价值才有意义/可能。如果false值有效,则必须将defined()
添加到测试中。 exists()
的使用频率低得多。最常见的情况可能是使用散列作为集合。 e.g。
my %set = map { $_ => undef } 'a' .. 'z';
使用undef
设置值有一些优点:
undef
值共享一个分配(节省内存)。exists()
测试稍快一些(因为Perl不必检索值,只确定有一个)。它还有一个缺点,就是你必须使用exists()
检查集合成员资格,这需要更多的输入,如果你忘了它就会做错事。
exists
有用的另一个地方是在尝试检索值之前探测锁定的哈希值(这会触发异常)。
答案 1 :(得分:15)
defined
检查变量的值,exists
检查它是否先前已声明/初始化。如果它存在,简单明了。
E.g:
$hash{$key} = undef;
# various return values:
exists $hash{$key}; # true
defined $hash{$key}; # false
$hash{$key}; # false
$hash{$key} = 0;
# various return values:
exists $hash{$key}; # true
defined $hash{$key}; # true
$hash{$key}; # false
exists $hash{$foo}; # false
答案 2 :(得分:7)
Perl documentation:
在哈希元素上使用时,已定义会告诉您 你是否定义了值,而不是 密钥是否存在于哈希中。 使用存在用于后一目的。
答案 3 :(得分:4)
如perldoc on exists
中所述:
给定一个指定哈希元素的表达式,如果哈希中的指定元素已经初始化,则返回true,即使相应的值未定义。
哈希或数组元素只有在它被定义和定义时才可以为真,只有它存在,但反过来不一定成立。
也就是说,哈希可以包含未定义的元素,如果是这种情况,defined
- 检查将返回false
,而exists
- 检查将返回{{ 1}}。
因此,如果您希望知道散列中是否存在给定条目,则应使用true
;如果您希望知道给定条目是否存在且已定义,则应使用exists
。
答案 4 :(得分:3)
此示例显示了差异。通常,任何结构的定义作品都存在与哈希相关。
my %hash=("1"=>undef);
print "exists:".exists($hash{"1"})."\n";
print "defined:".defined($hash{"1"})."\n";
差异很小而且不那么明显,所以期待人们会把它搞得一团糟。