为什么$a
成为arrayref?我没有推动任何事情。为什么Perl会在这种情况下自动生效?
perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a'
$VAR1 = [];
为什么$a
成为arrayref?我没有推动任何事情。为什么Perl会在这种情况下自动生效?
perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a'
$VAR1 = [];
这是因为for
循环将@$a
的内容视为左值 - 您可以分配给它。请记住for
将数组的内容别名为$_
。看起来,在@$a
中查找可混淆内容的行为足以导致自动版本化,即使没有别名的内容。
这种混叠的效果也是一致的。下面还会导致自动激活:
map {stuff} @$a;
grep {stuff} @$a;
a_subroutine(@$a);
如果要管理自动激活,您可以使用the eponymous pragma实现词汇的控制。
$a
成为一个数组引用由于Perl的autovivification功能。
当您将值为undef的标量变量当作任何引用时,Perl会将该值设为您尝试使用的引用类型。在这种情况下,$a
的值为undef,当您使用@$a
时,它必须自动生成$a
中的数组引用,以便将其解引用为数组引用。
好的,这里是另一个例子: perl -MData :: Dumper -e'use strict; @ $ A;” 无法在-e行1中使用未定义的值作为ARRAY参考。 – 2010-02-05 12:26:57
Perl在这种情况下不会自动生效。当它启动时没有任何规则,但通常在您想对变量执行某些操作时会发生autovivify。那里没有操作。 – 2010-02-05 12:47:41
$ 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.
自动激活在文档中在'的perldoc -f exists'和'的perldoc perlref'(也参见http://perldoc.perl.org)中所讨论。 – Ether 2010-02-05 18:52:05
@Ether:我错过了perldoc -f存在的例子。 “存在$ ref - > {key}”的Autovivification令人惊讶。 – 2010-02-05 20:17:14