Alternatywa dla Perla <> w Raku?

11

Tutaj uczę się omijać Raku (neé Perl 6), bardzo miło dookoła. Ale bardzo tęsknię za magią <>z Perla 5, w której możesz po prostu:

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

(wczytaj następny wiersz wejściowy do $x, zapętl resztę; dane wejściowe pochodzą z plików o nazwie wejściowej lub standardowej, jeśli nie podano pliku). Samouczki „Perl 5 do 6” / przewodniki po migracji / ... mówią tylko o slurpzapisywaniu całego pliku lub wprowadzaniu openpojedynczych plików według nazwy. Żadnej magii „nie pobieraj danych wejściowych z nazwanych plików w sekwencji”.

Chcę odzyskać magię!

vonbrand
źródło

Odpowiedzi:

17

Funkcjonalność, której szukasz, w dużej mierze istnieje. Ten skrypt:

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

Biorąc pod uwagę te pliki wejściowe:

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

Will, gdy zostanie wywołany jako:

raku script.p6 foo bar

Wyprodukuj wyjście:

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

Będzie również pobierał dane wyjściowe, $*INjeśli nie ma plików. Jedyną rzeczą, która nie istnieje, jest pojedynczy zamiennik <>, ponieważ zależałoby to od wantarraypodobnej funkcjonalności, która jest niezgodna z wielokrotną wysyłką (a Raku uważa, że ​​wielokrotna wysyłka jest znacznie bardziej przydatna).

Kandydaci z zerowym argumentem na geti linessą implementowani pod względem$*ARGFILES uchwytu pliku, który zapewnia funkcjonalność pobierania plików z listy argumentów lub z $*IN- co oznacza, że ​​można przekazać go do dowolnego kodu, który oczekuje uchwytu pliku.

Jonathan Worthington
źródło
1
lub pedantycznie: raku script.raku foo bar. ;-)
p6steve
0

Dosyć magii dla ciebie?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}
Holli
źródło
2
To fajne i OP powinien spróbować, ale na kilka sposobów to nie to samo. Zobacz odpowiedź jnthna, aby dowiedzieć się, jak emulować <>zachowanie, i zauważ, że raku .combbez argumentu dzieli ciąg na poszczególne znaki, podczas gdy Perl splitbez argumentu jest afaik, .split(/\s+/)w raku.
raiph
Alternatywą .splitbyłoby .words- docs.perl6.org/type/Str#routine_words
donaldh
1
Dlaczego, na litość boską, ciągle zapominam o wordsmetodzie?
Holli