🎄 22/25. 使用 Raku 反转文件
— 焉知非鱼欢迎来到Raku One-Liner Advent Calendar的第22天!今天,我们将继续使用文件,今天的目标是创建一个单行程序以相反的顺序打印文本文件的行(如tail -r
那样)。
第一个单行程序使用 STDIN 流完成工作:
.say for $*IN.lines.reverse
运行程序为:
$ raku reverse.pl < text.txt
如果要直接从Raku读取文件,请稍微修改程序以从命令行参数创建文件句柄:
.say for @*ARGS[0].IO.open.lines.reverse
现在运行如下:
$ raku reverse.pl text.txt
重要的是要记住,lines
方法的默认行为是从最后的行序列中排除换行符(该方法返回Seq
对象,而不是数组或列表)。它可能与你在使用Perl 5时习惯的方式相反。使用chomp
是一种常见的做法。
在Raku中,lines
方法根据IO::Handle
对象的nl-in 属性中存储的值来拆分行。
您可以使用以下小脚本查看行分隔符的当前值:
dd $_ for @*ARGS[0].IO.open.nl-in
这是您默认找到的内容:
$["\n", "\r\n"]
有趣的是,你可以控制的 lines
的行为,并告诉 Perl 不排除换行符:
@*ARGS[0].IO.open(chomp => False).lines.reverse.put
该 chomp
属性由默认设置为 True。您还可以更改默认分隔符:
@*ARGS[0].IO.open(
nl-in => "\r", chomp => False
).lines.reverse.put
请注意,如果没有 chomping,则不需要对行进行显式的for
循环:在最后两个单行中,直接在序列对象上调用.put
方法。在早期版本中,字符串不包含换行符,因此它们将打印为单个长行。
今天我将给你留一些小功课:告诉 say
和 put
之间的差异。
明天见!