Alternative zu Perls <> in Raku?

11

Hier lerne ich mich in Raku (geb. Perl 6) zurecht, rundum sehr schön. Aber ich vermisse die Magie <>von Perl 5 sehr, wo Sie einfach:

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

(Lesen Sie die nächste Eingabezeile ein $x, durchlaufen Sie den Rest; die Eingabe erfolgt aus den Dateien, die als Eingabe oder Standardeingabe bezeichnet werden, wenn keine Datei angegeben ist.) In den "Perl 5 bis 6" -Tutorials / Migrationshandbüchern / ... wird nur über slurpdie gesamte Datei oder openeinzelne Dateien nach Namen gesprochen. Keine Magie "Eingabe von benannten Dateien nacheinander nehmen" kann ich finden.

Ich will die Magie zurück!

vonbrand
quelle

Antworten:

17

Die gesuchte Funktionalität ist weitgehend vorhanden. Dieses Skript:

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

Angesichts dieser Eingabedateien:

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

Will, wenn aufgerufen als:

raku script.p6 foo bar

Produzieren Sie die Ausgabe:

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

Es wird auch ausgegeben, $*INwenn keine Dateien vorhanden sind. Das einzige, was nicht existiert, ist ein einziger Ersatz für <>, da dies von einer wantarrayähnlichen Funktionalität abhängen würde , die mit Mehrfachversand nicht kompatibel ist (und Raku hält Mehrfachversand für weitaus nützlicher).

Die Null-Argument-Kandidaten für getund lineswerden in Bezug auf$*ARGFILES ein Dateihandle implementiert , das die Funktionalität bietet, die Dateien aus der Argumentliste oder von zu übernehmen $*IN- was bedeutet, dass man sie an jeden Code übergeben kann, der ein Dateihandle erwartet.

Jonathan Worthington
quelle
1
oder pedantisch: raku script.raku foo bar. ;-)
p6steve
0

Genug Magie für dich?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}
Holli
quelle
2
Das ist cool und OP sollte es versuchen, aber in mancher Hinsicht ist es nicht dasselbe. In jnthns Antwort finden Sie Informationen zum Emulieren des <>Verhaltens. Beachten Sie, dass Rakus .combohne Argument eine Zeichenfolge in einzelne Zeichen splitaufteilen, während Perls ohne Argument afaik .split(/\s+/)in Raku ist.
Raiph
Eine Alternative zu .splitwäre .words- docs.perl6.org/type/Str#routine_words
donaldh
1
Warum vergesse ich beim heiligen Rngesus immer wieder die wordsMethode?
Holli