我使用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;
请帮助我理解这两个地图陈述。
答案 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,这也是你的第二个声明有效的原因,对于你阵列的每个单元,你选择第一个内部单元。