0

我一直在 if 语句中使用存在和定义

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

有没有同时做这两个的子程序?

更新:
似乎我没有给出很好的示例代码。要获得更好的问题和匹配的答案,请查看checks-for-existence-of-hash-key-creates-key

4

3 回答 3

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
于 2012-10-29T20:56:41.017 回答
2

defined(...)只有当为真时才能exists(...)为真,所以你的问题的答案是调用子例程defined

于 2012-10-29T20:56:51.757 回答
1
  • exists()检查键是否存在(即使 undef 值)
  • defined()检查是否定义了一个值

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

这是一个相关的问题,可以很好地解释它:存在和定义之间有什么区别?

于 2012-10-29T21:06:48.307 回答