有什么区别
if (defined $hash{$key}) { }
Run Code Online (Sandbox Code Playgroud)
和
if (exists $hash{$key}) { }
Run Code Online (Sandbox Code Playgroud)
我什么时候知道使用哪个?
Mic*_*man 98
这充分证明在对的perldoc条目defined
和exists
.这是一个快速摘要:
defined $hash{key}
告诉您是否定义了给定键的值(即不是undef
).用它来区分未定义的值和布尔上下文中的false值,例如0
和''
.
exists $hash{key}
告诉您是否%hash
包含给定的密钥.用它来区分未定义的值和不存在的值.
这是一个最简单的例子.鉴于此哈希:
my %hash = (a => 1, b => 0, c => undef);
Run Code Online (Sandbox Code Playgroud)
以下是检索,定义和存在的结果:
# key value defined exists
a 1 1 1
b 0 1 1
c undef 0 1
d undef 0 0
Run Code Online (Sandbox Code Playgroud)
在实践中,人们经常写作只是if ($hash{key}) {...}
因为(在许多常见情况下)只有真正的价值才有意义/可能.如果false值有效,则必须添加defined()
到测试中.exists()
使用频率低得多.最常见的情况可能是使用散列作为集合.例如
my %set = map { $_ => undef } 'a' .. 'z';
Run Code Online (Sandbox Code Playgroud)
使用undef
set值有一些优点:
undef
值共享一个分配(节省内存).exists()
测试稍微快一点(因为Perl不必检索值,只确定有一个值).它还有一个缺点,你必须使用它exists()
来检查集合成员资格,这需要更多的输入,如果你忘了它会做错误的事情.
另一个exists
有用的地方是在尝试检索值之前探测锁定的哈希值(这将触发异常).
TLP*_*TLP 15
defined
检查变量的值,exists
检查它是否先前已声明/初始化.如果它存在,简单明了.
例如:
$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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
49715 次 |
最近记录: |