首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么Perl函数"map“给出错误”map的参数不够“?

为什么Perl函数"map“给出错误”map的参数不够“?
EN

Stack Overflow用户
提问于 2014-01-09 22:39:42
回答 3查看 1.3K关注 0票数 8

这是我不明白的事。

此脚本工作正常(请注意映射函数中的级联):

代码语言:javascript
代码运行次数:0
运行
复制
#!/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
        };

但是如果没有连接,地图就无法工作。下面是我期望的脚本,但它不起作用:

代码语言:javascript
代码运行次数:0
运行
复制
#!/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.

你能解释一下这种行为吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-09 22:49:26

Perl使用启发式方法来决定是否使用:

代码语言:javascript
代码运行次数:0
运行
复制
map { STATEMENTS } LIST;   # or
map EXPR, LIST;

因为虽然"{“通常是块的开始,但它也可能是哈希the的开始。

这些启发式算法在令牌流(IIRC,两个令牌)中不会向前看太远。

可以使用以下方法强制"{“被解释为块:

代码语言:javascript
代码运行次数:0
运行
复制
map {; STATEMENTS } LIST;    # the semicolon acts as a disambigator

可以使用以下方法强制将"{“解释为散列:

代码语言:javascript
代码运行次数:0
运行
复制
map +{ LIST }, LIST;    # the plus sign acts as a disambigator

grep同样遭受着同样的痛苦。(从技术上讲,do也是如此,因为哈希then可以作为参数给出,然后将其作为文件名进行串并处理。不过,这很奇怪。)

票数 12
EN

Stack Overflow用户

发布于 2014-01-09 22:48:44

根据Documentation for map

因为Perl并不期待关闭的},所以它必须根据它在{之后发现的内容来猜测它所处理的是什么。通常情况下,它是正确的,但如果它没有,它将不会意识到某些事情是错误的,直到它到达}

举例说明:

代码语言:javascript
代码运行次数:0
运行
复制
%hash = map {  "\L$_" => 1  } @array # perl guesses EXPR. wrong
%hash = map { +"\L$_" => 1  } @array # perl guesses BLOCK. right

因此,添加+将给出与给出的第一个示例相同的结果

代码语言:javascript
代码运行次数:0
运行
复制
my %aa = map {  +'a'=> 1 } (1..3);
票数 6
EN

Stack Overflow用户

发布于 2014-01-09 22:49:38

在地图的上下文中,大括号有点模糊。它们可以按您的意图包围一个块,也可以是一个匿名哈希构造函数。perl解析器中有一些模糊逻辑,它试图猜测您指的是哪一个。

您的第二个例子看起来更像是perl的匿名散列。

请参阅地图的perldoc,它解释了这一点,并给出了一些解决办法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21032709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档