perl – 为什么map()掩码’undefined value’错误?

我想知道为什么在第二个片段中调用映射使得’未定义的值’错误消失了?
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

解决方法

这是因为 map()做了别名的方式(它本质上是使用for()循环).正在发生的事情是,在l值上下文中使用了isf,因此正在使用 auto-vivified.

在你的前一个例子中,你正在尝试直接在r值上下文中使用aref,这就是为什么它会生成错误(因为没有自动生成).

您可以简化对()的使用测试,您将得到与map()相同的结果:

use warnings;
use strict;

my $x;

for (@{ $x }){
    print "$_\n";
}

…没有输出.

为了在视觉上看到$x被自动生成为数组引用,可以使用ref()函数

my $x;
my @a = map $_,@{ $x };

print ref $x;

输出

ARRAY

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...