map,根据定义,获取一个列表,我们可以在其上执行一些转换,然后将其作为列表返回。有些人甚至会把它称为伪装的for循环。
我最近遇到了一些代码,这些代码简单地用于并映射在一起。例如:
perl -wE'@a=(1..5); say $_ for map { $_+=10 } @a'
11
12
13
14
15
我的问题是,是否有一种简单的方法可以记住何时使用和映射在一起。有人可以解释为什么需要吗?
答案 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
启用新功能。 @a
。 @a
并使用map转换数组内容,同时修改数组。 正如其他人所提到的那样,只需要for
来迭代map
返回的列表。