3
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 "}->"第二个 prints roed,正如预期的那样gulblaa这是编译器的弱点还是有一些我看不到的原因?我在 5.10、5.22 和 5.26 版本中测试并得到了这种行为。

4

1 回答 1

4

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

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

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

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

在另一个示例中,连接运算符 ( .) 执行此操作。


另一个+将以下代码强制处理为表达式的示例,以及有关相关文档的详细信息,请参见这篇文章

于 2019-09-04T08:29:05.840 回答