了解这个地图行为

时间:2011-06-29 06:14:31

标签: perl

我使用map来提取2D数组的第一个元素。这是一个小代码片段。

my $array = [ [1,11,111], [2,22], undef, [4] ];

my @firstList = map { (defined $_) && $_->[0] } @$array;

所以在这里我期待map返回一个数组,其元素的值为undef或$ array元素的第一个元素。

但输出与我期望的不一样。 对于undef,我得到'标量'类型的元素。

如果我用下面的块更改map语句,那么我得到预期的结果。

my @firstList = map { $_->[0] } @$array;

请帮助我理解这两个地图陈述。

2 个答案:

答案 0 :(得分:4)

它们都返回上次执行操作的结果。

首先,当它为(defined $_) && $_->[0]评估undef时,它会看到defined $_为false并停止处理布尔表达式。在这种情况下,根本不评估$_->[0]defined $_是评估的最后一个操作,其结果为false,我猜测它是用0表示的。

对于第二个,它是来自@$array的孩子的实际值,它是获得undef值的地方。

答案 1 :(得分:0)

map { (defined $_) && $_->[0] }

实际上遍历数组中的每个元素,并应用一些函数或表达式。在以下情况下,它是以下功能:defined($_) && $_->[0] 如果您的单元格未定义,则数组中的第三个单元格评估为defined(undef) && $->[0](等于'',您可以尝试...),而另一个评估为1 && $->[0]等于$ - > [0]。

BTW,这也是你的第二个声明有效的原因,对于你阵列的每个单元,你选择第一个内部单元。