了解这个地图行为

rpg*_*rpg 5 perl

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

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

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

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

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

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

my @firstList = map { $_->[0] } @$array;
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*ace 4

它们都返回最后执行的操作的结果。

对于第一个,当它计算(defined $_) && $_->[0]for时undef,它发现 为defined $_false 并停止处理布尔表达式。$_->[0]在这种情况下根本不会被评估。defined $_是评估的最后一个操作,其结果是false,我猜它用 表示0

@$array对于第二个,它是从子级获取值的实际值undef

  • 我想知道为什么 undef->[0] 有效(即使在“strict”下)。原来它是[autovivified](http://en.wikipedia.org/wiki/Autovivification),即在原始数组中隐式设置为“[]”。 (2认同)