4

为什么会$a变成arrayref?我没有向它推任何东西。

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

4 回答 4

8

这是因为for循环将 的内容@$a视为左值 - 您可以分配给它的东西。请记住,for将数组的内容别名为$_. 似乎在 , 中查找可别名内容的行为@$a足以导致自动激活,即使没有要别名的内容。

这种混叠效果也是一致的。以下也会导致自动存活:

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

如果你想管理自动激活,你可以使用同名的 pragma来实现词法控制。

于 2010-02-05T17:55:01.093 回答
3

当您将值为 undef 的标量变量视为任何类型的引用时,Perl 将该值作为您尝试使用的引用类型。在这种情况下,$a具有值 undef,并且当您使用 时@$a,它必须自动激活数组引用,$a以便您可以将其取消引用为数组引用。

于 2010-02-05T12:21:19.310 回答
0

$a由于 Perl 的自动生存功能,它成为一个 ARRAY 引用。

于 2010-02-05T11:34:49.207 回答
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.
于 2011-04-27T19:47:20.550 回答