Alternatif untuk Perl's <> di Raku?

11

Di sini belajar jalan saya di Raku (neé Perl 6), sangat bagus di sekitar. Tapi saya sangat merindukan keajaiban <>dari Perl 5, di mana Anda bisa:

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

(baca baris input berikutnya ke dalam $x, loop di atas sisanya; input dari file bernama input atau input standar jika tidak ada file yang diberikan). Tutorial / panduan migrasi "Perl 5 hingga 6" / ... cukup bicarakan tentang slurpkeseluruhan file, atau opening masing-masing file dengan namanya. Tidak ada keajaiban "ambil input dari file bernama secara berurutan" yang dapat saya temukan.

Saya ingin keajaiban kembali!

vonbrand
sumber

Jawaban:

17

Fungsi yang Anda cari sebagian besar ada. Skrip ini:

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

Diberikan file input ini:

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

Will, ketika dipanggil sebagai:

raku script.p6 foo bar

Menghasilkan output:

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

Ini juga akan mengambil output dari $*INjika tidak ada file. Satu-satunya hal yang tidak ada adalah penggantian tunggal untuk <>, karena itu akan tergantung pada wantarrayfungsionalitas seperti, yang tidak kompatibel dengan pengiriman ganda (dan Raku menganggap pengiriman ganda jauh lebih berguna).

Kandidat zero-arg untuk getdan linesdiimplementasikan dalam hal$*ARGFILES , file handle yang menyediakan fungsionalitas mengambil file dari daftar argumen atau dari $*IN- artinya seseorang dapat meneruskannya ke kode apa pun yang mengharapkan file handle.

Jonathan Worthington
sumber
1
atau, pedantically: raku script.raku foo bar. ;-)
p6steve
0

Cukup sihir untukmu?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}
Holli
sumber
2
Itu keren, dan OP harus mencobanya, tetapi tidak sama dalam beberapa cara. Lihat jawaban jnthn untuk bagaimana meniru <>perilaku, dan perhatikan bahwa raku .combtanpa argumen membagi string menjadi karakter individu, sedangkan Perl splittanpa argumen adalah, afaik, .split(/\s+/)dalam raku.
raiph
Alternatifnya .splitadalah .words- docs.perl6.org/type/Str#routine_words
donaldh
1
Mengapa, oleh rngesus suci, saya terus lupa tentang wordsmetode ini?
Holli