这是我不明白的事。
此脚本工作正常(请注意映射函数中的级联):
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %aa = map { 'a' . '' => 1 } (1..3);
print Dumper \%aa;
__END__
output:
$VAR1 = {
'a' => 1
};
但是如果没有连接,地图就无法工作。下面是我期望的脚本,但它不起作用:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %aa = map { 'a' => 1 } (1..3);
print Dumper \%aa;
__END__
output:
Not enough arguments for map at e.pl line 7, near "} ("
syntax error at e.pl line 7, near "} ("
Global symbol "%aa" requires explicit package name at e.pl line 9.
Execution of e.pl aborted due to compilation errors.
你能解释一下这种行为吗?
发布于 2014-01-09 14:49:26
Perl使用启发式方法来决定是否使用:
map { STATEMENTS } LIST; # or
map EXPR, LIST;
因为虽然"{“通常是块的开始,但它也可能是哈希the的开始。
这些启发式算法在令牌流(IIRC,两个令牌)中不会向前看太远。
可以使用以下方法强制"{“被解释为块:
map {; STATEMENTS } LIST; # the semicolon acts as a disambigator
可以使用以下方法强制将"{“解释为散列:
map +{ LIST }, LIST; # the plus sign acts as a disambigator
grep
同样遭受着同样的痛苦。(从技术上讲,do
也是如此,因为哈希then可以作为参数给出,然后将其作为文件名进行串并处理。不过,这很奇怪。)
发布于 2014-01-09 14:48:44
根据Documentation
for map
因为Perl并不期待关闭的
}
,所以它必须根据它在{
之后发现的内容来猜测它所处理的是什么。通常情况下,它是正确的,但如果它没有,它将不会意识到某些事情是错误的,直到它到达}
举例说明:
%hash = map { "\L$_" => 1 } @array # perl guesses EXPR. wrong
%hash = map { +"\L$_" => 1 } @array # perl guesses BLOCK. right
因此,添加+
将给出与给出的第一个示例相同的结果
my %aa = map { +'a'=> 1 } (1..3);
发布于 2014-01-09 14:49:38
在地图的上下文中,大括号有点模糊。它们可以按您的意图包围一个块,也可以是一个匿名哈希构造函数。perl解析器中有一些模糊逻辑,它试图猜测您指的是哪一个。
您的第二个例子看起来更像是perl的匿名散列。
请参阅地图的perldoc,它解释了这一点,并给出了一些解决办法。
https://stackoverflow.com/questions/21032709
复制相似问题