用于地图的用途

时间:2014-08-20 21:04:15

标签: perl

map,根据定义,获取一个列表,我们可以在其上执行一些转换,然后将其作为列表返回。有些人甚至会把它称为伪装的for循环。

我最近遇到了一些代码,这些代码简单地用于并映射在一起。例如:

perl -wE'@a=(1..5); say $_ for map { $_+=10 } @a'
11
12
13
14
15

我的问题是,是否有一种简单的方法可以记住何时使用和映射在一起。有人可以解释为什么需要吗?

5 个答案:

答案 0 :(得分:3)

for用于遍历map返回的列表并打印出每个元素。

您的示例与以下内容具有相同的效果:

@l = map {$_ += 10} @a;
for (@l) {
    say $_;
}

如果您想要的只是列表,那么您就不需要for

@l = map {$_ += 10} @a

答案 1 :(得分:1)

map返回一个新列表,for遍历该列表。您的for map行基本上归结为:

@a=(1..5);
@mapped = map { $_+=10 } @a;
for (@mapped) {
  say $_;
}

答案 2 :(得分:1)

您可以简化示例:

perl -wE 'map { say $_+=10 } (1..5)'

如您所见,map可用于执行每个项目的代码。当我必须将数组转换为另一个数组时,我使用map。您的示例(IMO)对于for循环更具可读性:

perl -wE 'say $_+=10 for(1..5)' 

答案 3 :(得分:1)

分开这些步骤可能会有所帮助。以下代码在功能上与您的单行代码相同:

use strict;
use warnings;
use feature 'say';

my @a = 1 .. 5;
# @mapped contains the result of applying the block to each element of @a
my @mapped = map { $_ += 10 } @a;
say for @mapped;

请注意,在脚本中使用$_ += 10是不必要的(也许是不合需要的),因为这会修改原始数组@a中的元素。改为使用$_ + 10表示返回的值不同,但原始值保持不变。

您不 使用map以及for,它只是将流程分为两个步骤。您的代码可以很容易:

my @a = 1 .. 5;
say $_ + 10 for @a;

my @a = 1 .. 5;
map { say $_ + 10 } @a;

答案 4 :(得分:1)

让我们使用B::Deparse

检查一下它的含义
$ perl -MO=Deparse -wE'@a=(1..5); say $_ for map { $_+=10 } @a'
BEGIN { $^W = 1; }
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
@a = 1..5;
say $_ foreach (map {$_ += 10;} @a);
-e syntax OK

所以基本上,你

  • 使用-w启用警告。
  • 使用-E启用新功能。
  • 创建一个包含5个元素的数组@a
  • 最后,迭代数组@a并使用map转换数组内容,同时修改数组。

正如其他人所提到的那样,只需要for来迭代map返回的列表。