perl - 为什么在 `map` BLOCK中没有插值?

标签 perl perl-data-structures

这会在Perl v5.20中引发错误:

use strict;
use warnings;
my @a = (2,3,9);
my %b = map { "number $_" => 2*$_ } @a;

错误:

syntax error at a.pl line 4, near "} @a"
Execution of a.pl aborted due to compilation errors.

这不是:
use strict;
use warnings;
my @a = (2,3,9);
my %b = map { "number ".$_ => 2*$_ } @a;

为什么在$_ BLOCK中不允许map内插?

最佳答案

map具有两种语法:

map BLOCK LIST
map EXPR, LIST

Perl必须确定您使用的语法。问题在于BLOCKEXPR都可以以{开头,因为{ ... }可以是哈希构造函数(例如my $h = { a => 1, b => 2 };)。

这意味着Perl的语法是模棱两可的。当遇到歧义时,perl会稍微向前看,然后猜出您的意思。在您的情况下,它猜错了。它猜测{是哈希构造函数的开始,而不是块的开始。您将需要明确消除歧义。

以下是消除块和哈希构造函数歧义的便捷方法:
+{ ... }   # Not a valid block, so must be a hash constructor.
{; ... }   # Perl looks head, and sees that this must be a block.

因此,在您的情况下,您可以使用
my %b = map {; "number $_" => 2*$_ } @a;

相关:Difference between returning +{} or {} in perl from a function, and return ref or value

关于perl - 为什么在 `map` BLOCK中没有插值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47311313/

相关文章:

perl - 在实用程序子例程中包装 Perl "die"和 "warn"

mysql - 仅在 Perl 上使用出生年份获取年龄

Perl 需要正确的 grep 运算符来匹配变量的值

arrays - 如何在散列的数组中引用 Perl 散列?

arrays - 2个哈希数组之间的算术运算

perl - 如何使用 Perl 提供图像并具有一定的安全性和最少的资源?

perl - 哪些 Perl 内置函数不能在 CORE::GLOBAL 中被覆盖?

perl - 如何访问嵌套 Perl 散列的值?

perl - 在 Perl 中将字符串 "a.b.c"转换为 $hash->{a}->{b}->{c}

Perl 哈希结构数组