map BLOCK LIST
map EXPR,LIST

对 LIST 中的每个元素评估 BLOCK 或 EXPR(在本地将 $_ 设置为每个元素),并组合每个评估结果的列表。LIST 中的每个元素都可能在生成的列表中产生零个、一个或多个元素,因此生成的列表中的元素数量可能与 LIST 中的元素数量不同。在标量上下文中,返回生成的元素总数。在列表上下文中,返回生成的列表。

my @chars = map(chr, @numbers);

将数字列表转换为相应的字符。

my @squares = map { $_ * $_ } @numbers;

将数字列表转换为它们的平方值。

my @squares = map { $_ > 5 ? ($_ * $_) : () } @numbers;

显示返回元素的数量可能与输入元素的数量不同。要省略元素,请返回空列表 ()。这也可以通过编写来实现

my @squares = map { $_ * $_ } grep { $_ > 5 } @numbers;

这使得意图更加清晰。

Map 始终返回一个列表,该列表可以分配给哈希,以便元素成为键值对。有关更多详细信息,请参阅 perldata

my %hash = map { get_a_key_for($_) => $_ } @array;

只是编写的一种有趣方式

my %hash;
foreach (@array) {
    $hash{get_a_key_for($_)} = $_;
}

请注意,$_ 是列表值的别名,因此它可以用来修改 LIST 的元素。虽然这很有用且受支持,但如果 LIST 的元素不是变量,则会导致奇怪的结果。在大多数情况下,为此目的使用常规的 foreach 循环会更清晰。另请参见 grep,用于生成一个列表,该列表包含原始列表中 BLOCK 或 EXPR 评估为真的那些项。

{ 既可以开始哈希引用,也可以开始代码块,因此 map { ... 可以是 map BLOCK LIST 或 map EXPR, LIST 的开始。由于 Perl 不会提前查找结束的 },因此它必须根据 { 之后找到的内容来猜测它正在处理哪种情况。通常它能正确识别,但如果它识别错误,它将无法意识到某些错误,直到它到达 } 并遇到缺少的(或意外的)逗号。语法错误将在 } 附近报告,但您需要更改 { 附近的某些内容,例如使用一元 + 或分号来帮助 Perl。

my %hash = map {  "\L$_" => 1  } @array # perl guesses EXPR. wrong
my %hash = map { +"\L$_" => 1  } @array # perl guesses BLOCK. right
my %hash = map {; "\L$_" => 1  } @array # this also works
my %hash = map { ("\L$_" => 1) } @array # as does this
my %hash = map {  lc($_) => 1  } @array # and this.
my %hash = map +( lc($_) => 1 ), @array # this is EXPR and works!

my %hash = map  ( lc($_), 1 ),   @array # evaluates to (1, @array)

或者强制使用匿名哈希构造函数 +{

my @hashes = map +{ lc($_) => 1 }, @array # EXPR, so needs
                                          # comma at end

以获得一个匿名哈希列表,每个哈希只有一个条目。