¿Alternativa a Perl's <> en Raku?

11

Aquí aprendí mi camino alrededor de Raku (neé Perl 6), muy agradable por todos lados. Pero extraño mucho la magia <>de Perl 5, donde puedes simplemente:

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

(lea la siguiente línea de entrada $x, repita el resto; la entrada es de los archivos nombrados como entrada o entrada estándar si no se proporciona ningún archivo). Los tutoriales / guías de migración de "Perl 5 a 6" / ... simplemente hablan sobre slurpel archivo completo o sobre openlos archivos individuales por nombre. No es mágico "tomar entrada de archivos con nombre en secuencia" que puedo encontrar.

¡Quiero la magia de vuelta!

vonbrand
fuente

Respuestas:

17

La funcionalidad que estás buscando existe en gran medida. Este guión:

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

Dados estos archivos de entradas:

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

Will, cuando se invoca como:

raku script.p6 foo bar

Producir la salida:

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

También tomará salida de $*INsi no hay archivos. Lo único que no existe es un reemplazo único <>, ya que eso dependería de una wantarrayfuncionalidad similar, que es incompatible con el envío múltiple (y Raku considera que el envío múltiple es mucho más útil).

Los candidatos de cero argumentos para gety linesse implementan en términos de$*ARGFILES un identificador de archivo que proporciona la funcionalidad de tomar los archivos de la lista de argumentos o de $*IN, lo que significa que se puede pasar a cualquier código que espere un identificador de archivo.

Jonathan Worthington
fuente
1
o, pedantemente: raku script.raku foo bar. ;-)
p6steve
0

¿Suficiente magia para ti?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}
Holli
fuente
2
Eso es genial, y OP debería intentarlo, pero no es lo mismo en algunos aspectos. Vea la respuesta de jnthn para saber cómo emular <>el comportamiento y observe que los raku .combsin argumento dividen una cadena en caracteres individuales, mientras que Perl splitsin argumento es, afaik, .split(/\s+/)en raku.
raiph
Una alternativa a .splitsería .words- docs.perl6.org/type/Str#routine_words
donaldh
1
¿Por qué, por el santo rngesus, me olvido del wordsmétodo?
Holli