我正在研究如何根据每个句子的长度对文件进行sorting,并从这个答案中find了这个片段
perl -ne 'push @a, $_ } { print sort { length $a <=> length $b } @a' input ^ ^
我testing了它,它的工作原理,但我不知道这是如何工作的! 据我所见,语法是错误的。 它有一个我已经标记的开放右支架和一个非封闭右支架。
我真的很难搞清楚如何在bash中运行perl命令
有人可以解释这个片段吗?
1997年,阿比盖尔(Abigail)发现了所谓的蝴蝶或者爱斯基摩人的问候 。
基本上它关闭while
循环强加的循环,以下是}{
while循环后执行的块。
这是perl如何解析这一行,
perl -MO=Deparse -ne 'push @a, $_ } { print sort { length $a <=> length $b } @a' input
LINE: while (defined($_ = <ARGV>)) { push @a, $_; }{ # <==here it is print((sort {length $a <=> length $b;} @a)); }
更常见的方法是使用END{}
块而不是}{
运算符:
perl -ne ' push @a, $_ END { print sort { length $a <=> length $b } @a } ' input
SzG的答案是正确的:脚本工作,因为-n
开关导致Perl 从字面上包装在下面的循环中的代码:
LINE: while (<>) { # code goes here ;}
在编译之前。 因此,您的示例代码变为:
LINE: while (<>) { push @a, $_ } { print sort { length $a <=> length $b } @a ;}
这是一个完全有效的Perl脚本。
无论如何,写这个脚本的方法不那么简单:
perl -ne 'push @a, $_; END { print sort { length $a <=> length $b } @a }' input
甚至只是:
perl -e 'print sort { length $a <=> length $b } <>' input
您使用-e script
选项运行在命令行上指定的Perl脚本。 如果你还添加了-n
选项,Perl将用一个包围脚本
while(<>) { your-script-here }
循环,逐行读取指定文件的标准输入。