RakuでのPerlの<>の代替?


11

ここで、Raku(neéPerl 6)の周りで私の方法を学びます。しかし、私<>はPerl 5 の魔法をひどく欠けています。

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

(次の入力行をに読み込み$x、残りをループします。入力は、入力として指定されたファイルから、またはファイルが指定されていない場合は標準入力からです)。"Perl 5 to 6"チュートリアル/移行ガイド/ ... slurpファイル全体またはopen個々のファイルを名前で話すことについて話します。「名前の付いたファイルから順番に入力を取る」という魔法はありません。

魔法を取り戻したい!

回答:


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は複数のディスパッチがはるかに有用であると考えています)。

引数なしの候補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引数はPerlのに対し、個々の文字に文字列を分割することなく、split引数がなくて、私の知る限りで、.split(/\s+/)楽にします。
レイフ

する代替.splitだろう.words- docs.perl6.org/type/Str#routine_words
donaldh

1
なぜ、聖なるgesgesによって、私はそのwords方法を忘れ続けるのですか?
Holli
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.