是否有Perl子程序存在并定义?

时间:2012-10-29 20:51:02

标签: perl operators subroutine

我使用exists并且始终在if语句中定义

if (exists($a->{b}) and defined($a->{b})

是否有一个子程序可以同时执行这两个操作?

更新
似乎我没有给出非常好的示例代码。如需更好的问题和匹配的答案,请查看checking-for-existence-of-hash-key-creates-key

3 个答案:

答案 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)

  • exists()检查密钥是否存在(即使是undef值)
  • defined()检查是否定义了值

如果您只想检查密钥是否存在(即使是undef),那么只需使用 exists()

这是一个很好地解释它的相关问题:What's the difference between exists and defined?