为什么map()会掩盖'undefined value'错误?

pla*_*etp 16 perl

我想知道为什么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)

  • `ref($ x)`也表示发生了自动复原. (3认同)