为什么 `map` BLOCK 中没有插值?
Why no interpolation within `map` BLOCK?
这会在 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;
为什么 $_
的插值在 map
块中是不允许的?
map
有两种语法:
map BLOCK LIST
map EXPR, LIST
Perl 必须确定您使用的语法。问题是 BLOCK
和 EXPR
都可以以 {
开头,因为 { ... }
可以是散列构造函数(例如 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;
相关:
这会在 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;
为什么 $_
的插值在 map
块中是不允许的?
map
有两种语法:
map BLOCK LIST
map EXPR, LIST
Perl 必须确定您使用的语法。问题是 BLOCK
和 EXPR
都可以以 {
开头,因为 { ... }
可以是散列构造函数(例如 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;
相关: