Alternativa a Perl <> in Raku?


11

Qui sto imparando a fare il giro di Raku (neé Perl 6), molto simpatico dappertutto. Ma mi manca molto la magia <>di Perl 5, dove puoi semplicemente:

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

(leggere la riga di input successiva in $x, scorrere il resto; l'input proviene dai file denominati come input o input standard se non viene fornito alcun file). Le esercitazioni "Perl da 5 a 6" / guide sulla migrazione / ... parlano solo slurpdell'ingaggio dell'intero file o opendell'ingegnerizzazione dei singoli file per nome. Nessuna magia "accetta input dai file con nome in sequenza" che posso trovare.

Rivoglio la magia!

Risposte:


17

La funzionalità che stai cercando esiste in gran parte. Questo script:

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

Dati questi file di input:

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

Will, quando invocato come:

raku script.p6 foo bar

Produrre l'output:

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

Prenderà anche l'output $*INse non ci sono file. L'unica cosa che non esiste è una singola sostituzione per <>, poiché ciò dipenderebbe da una wantarrayfunzionalità simile, che è incompatibile con la spedizione multipla (e Raku ritiene che la spedizione multipla sia molto più utile).

I candidati zero-arg per gete linessono implementati in termini di$*ARGFILES , un handle di file che fornisce la funzionalità di prendere i file dall'elenco degli argomenti o da $*IN- il che significa che uno può passarlo a qualsiasi codice che si aspetta un handle di file.


1
o, pedanticamente: raku script.raku foo bar. ;-)
p6steve

0

Abbastanza magia per te?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}

2
È fantastico, e OP dovrebbe provarlo, ma non è lo stesso in alcuni modi. Vedi la risposta di jnthn su come emulare <>il comportamento, e nota che il raku .combsenza argomento divide una stringa in singoli caratteri, mentre il Perl splitsenza argomento è, a dir poco, .split(/\s+/)in raku.
Raiph,

Un'alternativa .splitsarebbe .words: docs.perl6.org/type/Str#routine_words
donaldh

1
Perché, per il santo rngesus, continuo a dimenticare il wordsmetodo?
Holli
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.