对 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
以获得一个匿名哈希列表,每个哈希只有一个条目。