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!

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.


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(':');
}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.