在 Raku 中替代 Perl 的 <>?

von*_*and 11 migration raku

在这里学习我在 Raku(neé Perl 6)周围的方式,非常好。但我非常想念<>Perl 5的魔力,在那里你可以:

my $x = <>;
print $x;
while(<>) {
  print join(':', split);
}
Run Code Online (Sandbox Code Playgroud)

(将下一个输入行读入$x,循环其余部分;如果没有给出文件,输入来自命名为输入或标准输入的文件)。“Perl 5 到 6”教程/迁移指南/...只是谈论slurping 整个文件,或open按名称 ing 单个文件。我找不到魔法“按顺序从命名文件中输入”。

我要魔法回来!

Jon*_*ton 18

您正在寻找的功能在很大程度上存在。这个脚本:

my $x = get();
say "First: $x";
for lines() {
    .say
}
Run Code Online (Sandbox Code Playgroud)

鉴于这些输入文件:

$ cat foo
foo line 1
foo line 2
$ cat bar
bar line 1
bar line 2
Run Code Online (Sandbox Code Playgroud)

Will,当被调用为:

raku script.p6 foo bar
Run Code Online (Sandbox Code Playgroud)

产生输出:

First: foo line 1
foo line 2
bar line 1
bar line 2
Run Code Online (Sandbox Code Playgroud)

$*IN如果没有文件,它也会从中获取输出。唯一不存在的是 的单个替换<>,因为这将依赖于wantarray类似功能,这与多分派不兼容(并且 Raku 认为多分派更有用)。

对于零ARG候选人getlines实现来讲$*ARGFILES,文件句柄,它提供了从参数列表或以文件的功能,$*IN这意味着我们可以把它传递给期望一个文件句柄任何代码- 。