从`>`切换到```会破坏我的单行

pee*_*eer 7 perl

我正在过滤包含3个以上项目的行

perl -ne  'print if split > 2' file.txt
Run Code Online (Sandbox Code Playgroud)

但是当我想要过滤少于3个项目的行时,我无法使用

perl -ne  'print if split < 2' file.txt
#Unterminated <> operator at -e line 1.
Run Code Online (Sandbox Code Playgroud)

我可以用其中任何一个来解决它

perl -ne 'print if not split > 2' file.txt
perl -ne 'print if 2 > split' file.txt
Run Code Online (Sandbox Code Playgroud)

但是我想知道为什么表达式只会失败一个<,>.

Mar*_*cus 9

经过一番挖掘,看看你帖子上的评论,我想我找到了答案.解析器试图理解你看到的意思split <.在调用split时没有括号,需要猜测要传递多少个参数进行拆分(需要0-3,perldoc -f split有关详细信息,请参阅参考资料).

因此,默认情况下,您似乎假设您尝试使用至少一个参数调用它,该参数看起来像空文件句柄的开头<>.当它看到它不完整时,它会输出错误并中止.

这解释了为什么修补程序对您的帖子工作发表了评论.它们都明确表示不使用参数调用split,并且解析器不应该查找表达式,<然后可以将该字符视为运算符.

  • `<`字符是Perl解析器中几个极其重载的字符之一,因此它可能经常以这种方式混淆.其他值得注意的是`/`和`*`(原因各有不同!) (3认同)
  • 请参阅[this](/sf/answers/3584289341/)以了解如何重载`<`. (2认同)