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 "}->"但第二行给了我roed,gul与blaa预期的一样。这是编译器的弱点,还是有我看不见的某些原因?我测试并在版本5.10、5.22和5.26中获得了此行为。
将{...}被解释为一个块,而不是一个hashref。我们可以通过添加一个+
perl -E'say for map s/(æ|ø|å)/+{qw(æ ae ø oe å aa)}->{$1}/ger, qw(rød gul blå)'
Run Code Online (Sandbox Code Playgroud)
现在它起作用了,因为一元之后+必须是一个表达式;因此+消除了代码的歧义。然后,解释器继续将构造识别为匿名哈希构造器。
否则,它必须猜测,{因为在确定是解析块还是表达式之前无法解析。它可以分析上下文以确定是什么{...},但是如果认为这样做太复杂而无法取舍,我会认为是合理的。
在另一个示例中,是由串联运算符(.)完成的。