🎄 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
这一次,后缀++
被应用于$
。
我希望今天这是一次有益的旅程。明天见!