为什么Perl在这种情况下会自动更新?

时间:2010-02-05 11:31:13

标签: perl reference autovivification

为什么$a会成为arrayref?我不是在推动它。

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

4 个答案:

答案 0 :(得分:8)

这是因为for循环将@$a的内容视为左值 - 您可以分配给它。请记住,for将数组的内容别名为$_。似乎在@$a中查找可混淆内容的行为足以导致自动更新,即使没有别名内容也是如此。

这种混叠效果也是一致的。以下内容也导致自动化:

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

如果您想管理自动审核,可以使用the eponymous pragma来实现词汇控制。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

由于Perl的autovivification功能,

$a成为ARRAY参考。

答案 3 :(得分: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.