【问题标题】:understanding this map behavior了解此地图行为
【发布时间】:2011-06-29 06:14:30
【问题描述】:

我正在使用 map 来提取二维数组的第一个元素。这里是小代码sn-p。

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

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

所以在这里我希望地图返回一个数组,其中的元素的值为 undef 或 $array 元素的第一个元素。

但输出与我期望的不同。 对于 undef,我得到了“标量”类型的元素。

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

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

请帮助我理解这两个地图语句。

【问题讨论】:

    标签: perl


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想知道为什么 undef->[0] 有效(即使在strict 下)。结果是autovivified,即在原始数组中隐式设置为[]
    • @Dallaylaen:这会绊倒足够多的人,以至于 CPAN 在search.cpan.org/perldoc?autovivification 有一个“自动生存”模块,允许您使用命令no autovivification; 禁用它
    【解决方案2】:
    map { (defined $_) && $_->[0] }
    

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

    顺便说一句,这也是您的第二个语句起作用的原因,对于数组的每个单元格,您选择第一个内部单元格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2015-07-21
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多