hashref查找中的语法错误,看不到原因

Kje*_* S. 3 perl reference hashref

perl -E 'say for map s/(æ|ø|å)/   {qw(æ ae ø oe å aa)}->{$1}/ger, qw(rød gul blå)'
perl -E 'say for map s/(æ|ø|å)/"".{qw(æ ae ø oe å aa)}->{$1}/ger, qw(rød gul blå)'
Run Code Online (Sandbox Code Playgroud)

上面的第一行给了我,syntax error at -e line 1, near "}->"但第二行给了我roedgulblaa预期的一样。这是编译器的弱点,还是有我看不见的某些原因?我测试并在版本5.10、5.22和5.26中获得了此行为。

zdi*_*dim 5

{...}解释为一个块,而不是一个hashref。我们可以通过添加一个+

perl -E'say for map s/(æ|ø|å)/+{qw(æ ae ø oe å aa)}->{$1}/ger, qw(rød gul blå)'
Run Code Online (Sandbox Code Playgroud)

现在它起作用了,因为一元之后+必须是一个表达式;因此+消除了代码的歧义。然后,解释器继续将构造识别为匿名哈希构造器。

否则,它必须猜测,{因为在确定是解析块还是表达式之前无法解析。它可以分析上下文以确定是什么{...},但是如果认为这样做太复杂而无法取舍,我会认为是合理的。

在另一个示例中,是由串联运算符(.)完成的。