🎄 20/25. 在 Perl 6 单行程序中使用命令行选项

欢迎来到 Perl 6 One-Liner Advent Calendar 的第20天!到目前为止,我们创建了大约25种不同的单行程序,但从未讨论过Rakudo Perl 6编译器为我们提供的命令行选项。

-e

使用(Rakudo)Perl 6时的第一个选项是-e。它需要一个带有Perl 6单行程序的字符串并立即执行。

例如,打印当前Perl 6规范的版本:

1
2
$ perl6 -e'$ * PERL.version.say'
v6.c

注意不要使用Perl 5.10+样式的大写字母 -E,它与-e相同,但也激活诸如 say 之类的功能。在Perl 6中,选项始终为小写。

-n

此选项为每行输入数据重复运行代码。当您想要处理文件时,这非常方便。例如,这是一个单行程序,将行中的值相加并打印总和:

1
perl6 -ne'say [+] .split(" ")' data.txt

如果data.txt文件包含以下内容:

1
2
3
10 20 30 40 
1 2 3 4
5 6 7 8

然后单行程序的结果是:

1
2
3
100 
10
26

这与你是否使用shell的输入重定向没有区别; 以下单行程序也有效:

1
perl6 -ne'say [+] .split(" ")' < data.txt

确保将 e 选项放在选项列表中的最后一个(因此,不是perl6 -en'...')或拆分选项:perl6 -n -e'...'

-p

此选项类似于-n,但在每次迭代后打印主题变量。

以下单行程序反转文件中的行并将其打印到控制台:

1
perl6 -npe'.=flip' data.txt

对于相同的输入文件,结果将如下所示:

1
2
3
04 03 02 01 
4 3 2 1
8 7 6 5

请注意,您必须更新$_变量,因此键入.=flip。如果你只有.flip,你将反转字符串,但不会使用该结果并打印原始行。

使用.flip且没有-p 选项的等效程序将如下所示:

1
perl6 -ne'.flip.say'data.txt

派对之后

让我们来看看Perl One-Liners书中的几个单行程序,并在Perl 6中创建相应的单行程序。

Double-space a file

1
perl6 -npe's/$/\n/' text.txt

删除所有空行

1
perl6 -ne'.say if .chars' text.txt

根据您定义“空白”的方式,您可能需要另一个跳过包含空格的行的单行程序:

1
perl6 -ne'.say if /\S/' text.txt

对文件中的所有行进行编号

1
perl6 -ne'say ++$ ~ ". " ~ $_' text.txt

这段代码可能需要注释。在 $ 变量是一个状态变量,它不用声明就可使用。

将所有文本转换为大写

1
perl6 -npe'.=uc' text.txt

从每行的开头和结尾剥去空格

1
perl6 -npe'.=trim' text.txt

打印文件的第一行

1
perl6 -ne'.say ; exit' text.txt

打印文件的前10行

1
perl6 -npe'exit if $++ == 10' text.txt

这一次,后缀++被应用于$

我希望今天这是一次有益的旅程。明天见!