哈希引用查找中的语法错误,看不到原因


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å)'

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

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

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

现在它可以工作了,因为一元+后面的内容必须是一个表达式;所以+消除了代码的歧义。然后解释器继续将构造标识为匿名哈希构造函数。

否则,它必须猜测{因为它无法解析,然后再决定它是解析块还是表达式。它可以分析上下文以确定{...}是什么,但如果这仅仅被认为是过于复杂的权衡,我会发现这是合理的。

在另一个例子中,是连接运算符(.(来做这件事。


有关一元+强制将以下代码视为表达式的另一个示例,以及有关相关文档的详细信息,请参阅此帖子。

最新更新