Wait the light to fall

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

焉知非鱼

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

-e #

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

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

$ raku -e'$ * PERL.version.say'
v6.c

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

-n #

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

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

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

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

然后单行程序的结果是:

100 
10 
26

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

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

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

-p #

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

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

raku -npe'.=flip' data.txt

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

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

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

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

raku -ne'.flip.say'data.txt

派对之后 #

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

Double-space a file #

raku -npe's/$/\n/' text.txt

删除所有空行 #

raku -ne'.say if .chars' text.txt 

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

raku -ne'.say if /\S/' text.txt 

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

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

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

将所有文本转换为大写 #

raku -npe'.=uc' text.txt

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

raku -npe'.=trim' text.txt

打印文件的第一行 #

raku -ne'.say ; exit' text.txt 

打印文件的前10行 #

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

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

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