我想知道为什么map在第二个片段中调用会导致"未定义值"错误消失?
use strict;
use warnings;
my $x;
my @a = @{ $x }; # error: Can't use an undefined value as an ARRAY reference
Run Code Online (Sandbox Code Playgroud)
相比于:
use strict;
use warnings;
my $x;
my @a = map $_, @{ $x }; # no error, @a is empty
Run Code Online (Sandbox Code Playgroud)
ste*_*ieb 19
这是由于map()进行别名(它实际上是使用for()循环)的方式.发生的事情是,aref正在l值上下文中使用,因此正在自动生存.
在前面的例子中,你试图直接在r值上下文中使用aref,这就是它产生错误的原因(因为没有发生自动生成).
您可以简化要使用的测试for(),并获得与以下相同的结果map():
use warnings;
use strict;
my $x;
for (@{ $x }){
print "$_\n";
}
Run Code Online (Sandbox Code Playgroud)
......没有输出.
要直观地看到它$x是自动生成的数组引用,您可以使用ref()函数:
my $x;
my @a = map $_, @{ $x };
print ref $x;
Run Code Online (Sandbox Code Playgroud)
输出:
ARRAY
Run Code Online (Sandbox Code Playgroud)