为什么在这种情况下Perl会自动创建数据结构?

4

为什么$a会变成一个数组引用?我没有向它中添加任何元素。

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

2
自动初始化(Autovivification)在文档 perldoc -f existsperldoc perlref 中有讨论(也可参见 http://perldoc.perl.org)。 - Ether
@Ether:我错过了perldoc -f exists中的那些例子。通过"exists $ref->{key}"实现自动初始化是令人惊讶的。 - Eugene Yarmash
4个回答

8
这是因为for循环将@$a的内容视为lvalues——可以分配的东西。请记住,for将数组的内容别名为$_。似乎在@$a中查找可别名内容的行为足以引起自动生成,即使没有内容可别名。
别名的这种效果也是一致的。以下操作也会导致自动生成:
  • map {stuff} @$a;
  • grep {stuff} @$a;
  • a_subroutine( @$a);
如果您想管理自动生成,请使用同名编译指示来实现词汇控制。

3
当您将值为undef的标量变量视为任何类型的引用时,Perl会将该值作为您尝试使用的引用类型。在这种情况下,$a的值为undef,当您使用@$a时,它必须自动创建一个数组引用并将其放入$a中,以便您可以对其进行解引用。

1
好的,这里是另一个例子:perl -MData::Dumper -e 'use strict; @$a;' 无法在-e行1使用未定义值作为数组引用。 - Eugene Yarmash
3
在这种情况下,Perl不会自动创建变量。没有一个固定的规则来确定何时自动创建变量,但通常在你想对变量执行某些操作时自动创建变量。在这里并没有进行任何操作。 - brian d foy

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.

0

$a由于Perl的自动存活特性变成了一个数组引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接