class IO::ArgFiles is IO::CatHandle { }

此类存在于向后兼容的原因,并且不为 IO::CatHandle 提供任何其他方法,因此可以像这样以相同的方式使用它

my $argfiles = IO::ArgFiles.new(@*ARGS);
.say for $argfiles.lines;

如果使用 raku io-argfiles.raku *.raku 调用它,它将打印目录中所有具有该扩展名的文件的内容。但是,这完全等同于

my $argfiles = IO::CatHandle.new(@*ARGS);
.say for $argfiles.lines;

变量§

$*ARGFILES§

此类是 $*ARGFILES 变量背后的魔力,该变量提供了一种遍历命令行中传递给程序的文件(即 @*ARGS 的元素)的方法。因此,上面的示例可以简化为

.say for $*ARGFILES.lines;
 
# or 
while ! $*ARGFILES.eof {
    say $*ARGFILES.get;
}
 
# or 
say $*ARGFILES.slurp;

将上述变体之一保存在文件中,例如 argfiles.raku。然后创建另一个文件(例如,命名为 sonnet18.txt,内容为

Shall I compare thee to a summer's day?

运行命令

$ raku argfiles.raku sonnet18.txt

然后将给出输出

Shall I compare thee to a summer's day?

从 6.d 语言开始,$*ARGFILES sub MAIN 中始终设置为 $*IN,即使 @*ARGS 不为空。这意味着

sub MAIN () {
    .say for $*ARGFILES.lines;
}

例如,可以用作 cat *.raku | raku argfiles-main.raku,完全等同于

sub MAIN () {
    .say for $*IN.lines;
}

事实上,不能用于处理命令行中的参数,因为在这种情况下,它会导致使用错误。

请记住,对象 $*ARGFILES 将包含命令行中每个参数的句柄,即使该参数不是有效文件。您可以通过 .handles 方法检索它们。

for $*ARGFILES.handles -> $fh {
    say $fh;
}

如果任何参数不是有效的文件名,则该代码将失败。您必须在另一个级别处理这种情况,例如检查 @*ARGS 是否包含有效的文件名。