我想知道为什么第二个代码段中对map
的调用会产生未定义的值'错误消失了?
use strict;
use warnings;
my $x;
my @a = @{ $x }; # error: Can't use an undefined value as an ARRAY reference
比较:
use strict;
use warnings;
my $x;
my @a = map $_, @{ $x }; # no error, @a is empty
答案 0 :(得分:19)
这是由于map()做混叠的方式(它主要使用for()
循环)。发生的事情是,aref正在l值上下文中使用,因此存在auto-vivified。
在前一个例子中,你试图直接在r值上下文中使用aref,这就是它产生错误的原因(因为没有发生自动生成)。
您可以简化测试以使用for()
,并获得与map()
相同的结果:
use warnings;
use strict;
my $x;
for (@{ $x }){
print "$_\n";
}
......没有输出。
要直观地看到$x
已自动生成为数组引用,您可以使用ref()函数:
my $x;
my @a = map $_, @{ $x };
print ref $x;
输出:
ARRAY