Wait the light to fall

🎄 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方法。在早期版本中,字符串不包含换行符,因此它们将打印为单个长行。

今天我将给你留一些小功课:告诉 sayput 之间的差异。

明天见!