2010-02-05 107 views
4

为什么$a成为arrayref?我没有推动任何事情。为什么Perl会在这种情况下自动生效?

perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a' 
$VAR1 = []; 
+2

自动激活在文档中在'的perldoc -f exists'和'的perldoc perlref'(也参见http://perldoc.perl.org)中所讨论。 – Ether 2010-02-05 18:52:05

+0

@Ether:我错过了perldoc -f存在的例子。 “存在$ ref - > {key}”的Autovivification令人惊讶。 – 2010-02-05 20:17:14

回答

8

这是因为for循环将@$a的内容视为左值 - 您可以分配给它。请记住for将数组的内容别名为$_。看起来,在@$a中查找可混淆内容的行为足以导致自动版本化,即使没有别名的内容。

这种混叠的效果也是一致的。下面还会导致自动激活:

  • map {stuff} @$a;
  • grep {stuff} @$a;
  • a_subroutine(@$a);

如果要管理自动激活,您可以使用the eponymous pragma实现词汇的控制。

3

当您将值为undef的标量变量当作任何引用时,Perl会将该值设为您尝试使用的引用类型。在这种情况下,$a的值为undef,当您使用@$a时,它必须自动生成$a中的数组引用,以便将其解引用为数组引用。

+1

好的,这里是另一个例子: perl -MData :: Dumper -e'use strict; @ $ A;” 无法在-e行1中使用未定义的值作为ARRAY参考。 – 2010-02-05 12:26:57

+3

Perl在这种情况下不会自动生效。当它启动时没有任何规则,但通常在您想对变量执行某些操作时会发生autovivify。那里没有操作。 – 2010-02-05 12:47:41

0

$ a和$ b是Perl中的特殊变量(用于排序),并且具有它们自己的特殊范围。

perl -MData::Dumper -e 'use strict; 1 for @$c; print Dumper $c' 

产生

Global symbol "$c" requires explicit package name at -e line 1. 
Global symbol "$c" requires explicit package name at -e line 1. 
Execution of -e aborted due to compilation errors. 
相关问题