Perl语法细节 - 列出有或没有parens的上下文?

Sky*_*los 2 perl

这有效:

my $r = someSubroutine( map { ( 0 => $_ ) } @hosts)
Run Code Online (Sandbox Code Playgroud)

这不起作用,给出语法错误:

my $r = someSubroutine( map { 0 => $_ } @hosts)
Run Code Online (Sandbox Code Playgroud)

我认为我理解的是,{ }映射之后相当于一个闭包或匿名子程序.

但是如果我value, value在正常子程序的末尾添加一个" ",它将返回这些值的列表.如果我对地图使用这种简洁,那就是语法错误.

Bor*_*din 6

首先,这是一个非常奇怪的陈述.map产生的列表看起来像

0, $hosts[0], 0, $hosts[1], 0, $hosts[2], ...
Run Code Online (Sandbox Code Playgroud)

因此它对于分配哈希是无用的,因为它将是相同的

my  %hash = (0 => $hosts[-1])
Run Code Online (Sandbox Code Playgroud)

map将接受BLOCK(这是你正在使用的)或一个简单的EXPRESSION作为其第一个参数.这里的问题是{ 0 => $_ }看起来非常像一个带有单个元素的匿名哈希,它是一个表达式,这就是解析器所猜测的.一种表达要求后,一个逗号,第二个参数之前,但在perl的获取到结束花map { 0 => $_ } @hosts它没有找到一个,这样它抛出一个语法错误,因为它是太远回溯到左括号,并承担而是阻止

文档就像这样

{启动散列引用和块,因此map { ...可以是映射BLOCK LIST的开头或映射EXPR,LIST.因为Perl没有预见到结束,}所以它必须根据它在之后发现的内容来猜测它正在处理什么{.通常情况下它是正确的,但如果它没有,它将不会意识到出现问题,直到它}遇到并遇到丢失(或意外)的逗号.语法错误将在报告附近报告},但您需要更改附近的内容,{例如使用一元+或分号给Perl一些帮助

解决方案是在您发现时消除歧义.任何这些都可行

map +( 0 => $_ ), @hosts

map(( 0 => $_ ), @hosts)

map { +0 => $_ } @hosts

map { ( 0 => $_ ) } @hosts

map { ; 0 => $_ } @hosts
Run Code Online (Sandbox Code Playgroud)