2012-10-29 20 views

回答

2

defined(...)exists(...)是真实的,所以只能是真回答你问题是该子程序被称为defined

+0

这是不对的。在最坏的情况下,当你使用' - >'操作符时,你无意中将'$ a'提升为散列引用。 – mob

+0

应该指出,我最初的假设是错误的(定义不会产生一个关键)。 –

+0

nit:'defined'是一个操作符,而不是一个子操作符。 – ikegami

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 

->另一方面,autovivifies为正常。

>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 
+0

不使用时,使用散列上定义的您无意中创建密钥。 –

+0

“不,它不是”是5yo的答案。不要与没有支持的人相抗衡,或至少验证你的主张。我的代码永远不会创建密钥。它可以在'$ a'中创建一个哈希引用,但您的原始代码也可以。 (这是创建哈希引用的'''''',这是在你的代码和我的代码中执行的第一件事。) – ikegami

+2

@EricFossum你可能会想到autovivification,如果你在二维结构,比如'defined $ foo - > {bar} {baz}',它创建了子$'foo - > {bar}'但不是baz。 – TLP

1
  • 如果该键存在(即使是undef值)存在()检查
  • ()定义检查是否有定义

,如果你只是想检查的值关键存在(即使undef)然后只是使用存在()

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

相关问题