在Raku中可以替代Perl的<>吗?


11

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

my $x = <>;
print $x;
while(<>) {
  print join(':', split);
}

(将下一条输入行读入$x,循环其余部分;输入来自名为input的文件或标准输入(如果未提供文件))。“ Perl 5到6”教程/迁移指南/ ...仅讨论slurp将整个文件或open按名称命名的单个文件。我找不到“从顺序的命名文件中获取输入”的魔术。

我想要魔术!

Answers:


17

您正在寻找的功能大部分存在。该脚本:

my $x = get();
say "First: $x";
for lines() {
    .say
}

给定这些输入文件:

$ cat foo
foo line 1
foo line 2
$ cat bar
bar line 1
bar line 2

将被调用为:

raku script.p6 foo bar

产生输出:

First: foo line 1
foo line 2
bar line 1
bar line 2

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

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


1
或者,就学问而言:raku script.raku foo bar。;-)
p6steve

0

你的魔法够了吗?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}

2
太酷了,OP应该尝试一下,但是在某些方面并不相同。有关如何模仿<>行为的信息,请参见jnthn的答案,并请注意,.comb不带参数的raku 将字符串拆分成单个字符,split而不带参数的Perl 则将afaik命名.split(/\s+/)为raku。
雷夫

替代方法.split.wordsdocs.perl6.org/type/Str#routine_words
donaldh

1
为什么在神圣的rngesus的帮助下,我总是忘记这种words方法?
霍利(Holli)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.