我使用exists并且始终在if语句中定义
if (exists($a->{b}) and defined($a->{b})
是否有一个子程序可以同时执行这两个操作?
更新
似乎我没有给出非常好的示例代码。如需更好的问题和匹配的答案,请查看checking-for-existence-of-hash-key-creates-key。
答案 0 :(得分:6)
与
相同if (defined($a->{b}))
关于评论中的回复,defined
不会实例化密钥。
>perl -E"if (exists($a->{b}) and defined($a->{b})) { } say 0+keys(%$a);"
0
>perl -E"if (defined($a->{b})) { } say 0+keys(%$a);"
0
另一方面, ->
自动恢复正常。
>perl -E"if (defined($a->{b})) { } say $a || 0;"
HASH(0x3fbd8c)
但exists
也是如此。
>perl -E"if (exists($a->{b}) and defined($a->{b})) { } say $a || 0;"
HASH(0x81bd7c)
如果您试图避免自动更新,则使用
>perl -E"if ($a && defined($a->{b})) { } say $a || 0;"
0
或
>perl -E"no autovivification; if (defined($a->{b})) { } say $a || 0;"
0
答案 1 :(得分:2)
defined(...)
只有在exists(...)
为真时才能为真,因此您的问题的答案是子例程被称为defined
。
答案 2 :(得分:1)
如果您只想检查密钥是否存在(即使是undef),那么只需使用 exists()
这是一个很好地解释它的相关问题:What's the difference between exists and defined?