🎄 24/25. 在 Perl 6 中用 $*ARGFILES 读取文件

欢迎来到Perl 6 One-Liner Advent Calendar的24天!

在前几天,我们正在读取文本文件,因此讨论 $*ARGFILES是合乎逻辑的,这是一个内置的动态变量,在处理多个输入文件时可能很方便。

如何读取命令行中传递的两个或多个文件?

1
$ perl6 work.pl a.txt b.txt

如果您需要将所有文件一起处理,就像它们是单个数据源一样,您可以要求我们今天的变量以单行方式完成工作:

1
.say for $*ARGFILES.lines

在程序内部,您不必考虑循环文件; $*ARGFILES将自动为您做到这一点。

如果命令行中没有文件,则该变量将附加到 STDIN:

1
$ cat a.txt b.txt | perl6 work.pl

确实很方便,不是吗?

6.d和MAIN

如果你想在更大的程序中使用它,我也必须警告你。考虑以下程序:

1
2
3
sub MAIN(*@files) {
.say for $*ARGFILES.lines;
}

在 Perl 6.d 中, $*ARGFILES 在MAIN子例程内部和它之外的工作方式不同。

这个程序将完全适用于 Perl 6.c,但不适用于Perl 6.d. 换句话说,在Rakudo Star中,包括版本2018.10,$*ARGFILES 在命令行中处理文件名,但从 Rakudo Star 2018.12 开始,如果在 MAIN 中使用它,它将始终连接到 $*IN

这就是今天的 advent 文章的结束,几乎是今年整个日历的结束。不过,明天再来!