与 perl 智能匹配运算符相关的问题



对于给定的输入文件单词.txt,过滤所有包含升序字符的行

f

bot
art
are
boat
toe
flee
reed

1)

# perl -F -lane 'print if $_ eq join "", sort @F' f
bot
art

2)

# perl -F -lane '@b = sort @F;if(@F~~@b){print $_}' f 
bot
art

前两种方法是正确的,但为什么第三种方法没有结果呢?

3)

# perl -F -lane 'print if sort @F~~@F' f

另外,智能匹配运营商(~~)是否有缺点

首先,您不应该使用智能匹配运算符。

这是一个实验性功能。(即使未启用警告,使用它也会导致 5.18+ 的警告,尽管警告可以静音。它可以随时更改或删除。

此外,它被认为是一个失败的实验。它的设计被认为是有缺陷的。


你有两个问题。

第一个是优先级问题。sort @F ~~ @F意味着sort( @F ~~ @F )。帕伦斯会解决这个问题。

( sort @F ) ~~ @F

但这也行不通。左侧没有数组或数组引用,因此无法获得所需的ARRAY ~~ ARRAY行为。要获得这种行为,您可以使用

[ sort @F ] ~~ @F

最新更新