为什么map()会掩盖'未定义的值'错误?

时间:2016-10-25 18:18:07

标签: perl

我想知道为什么第二个代码段中对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

1 个答案:

答案 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