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

时间:2017-11-15 15:31:07

标签: perl perl-data-structures

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

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 BLOCK中不允许OutputName, col1, col2, col3, col4, col5 PersonReport, name, surname, age, dob, id AccountReport, f1, f2, f3, f4, f5 TransactionReport, f1, f2, f3, f4, f5的插值?

1 个答案:

答案 0 :(得分:14)

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