存在和定义之间有什么区别?

时间:2011-06-30 12:17:18

标签: perl

之间有什么区别
if (defined $hash{$key}) { }

if (exists $hash{$key}) { }

我什么时候知道使用哪个?

5 个答案:

答案 0 :(得分:92)

definedexists的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设置值有一些优点:

  1. 它更准确地表示意图(只有键是有意义的,而不是值)。
  2. 所有undef值共享一个分配(节省内存)。
  3. exists()测试稍快一些(因为Perl不必检索值,只确定有一个)。
  4. 它还有一个缺点,就是你必须使用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";

差异很小而且不那么明显,所以期待人们会把它搞得一团糟。