Alternativa ao Perl's <> em Raku?

11

Aqui aprendendo meu caminho por Raku (ne Perl 6), muito legal por toda parte. Mas sinto muita falta da magia <>do Perl 5, onde você pode apenas:

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

(leia a próxima linha de entrada em $x, faça um loop sobre o restante; a entrada é dos arquivos nomeados como entrada ou entrada padrão, se nenhum arquivo for fornecido). Os tutoriais "Perl 5 a 6" / guias de migração / ... apenas falam sobre slurpo arquivo inteiro ou sobre openarquivos individuais por nome. Nenhuma mágica "recebe entrada de arquivos nomeados em sequência" que posso encontrar.

Eu quero a mágica de volta!

vonbrand
fonte

Respostas:

17

A funcionalidade que você está procurando existe em grande parte. Este script:

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

Dados esses arquivos de entradas:

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

Will, quando chamado como:

raku script.p6 foo bar

Produzir a saída:

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

Ele também terá saída $*INse não houver arquivos. A única coisa que não existe é uma única substituição <>, pois isso dependeria da wantarrayfuncionalidade similar, que é incompatível com o envio múltiplo (e Raku considera o envio múltiplo muito mais útil).

Os candidatos a zero argumento gete linessão implementados em termos de$*ARGFILES , um identificador de arquivo que fornece a funcionalidade de retirar os arquivos da lista de argumentos ou de $*IN- o que significa que é possível passá-lo para qualquer código que espere um identificador de arquivo.

Jonathan Worthington
fonte
11
ou, pedantemente: raku script.raku foo bar. ;-)
p6steve 31/03
0

Magia suficiente para você?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}
Holli
fonte
2
Isso é legal, e o OP deve tentar, mas não é o mesmo de algumas maneiras. Veja a resposta de jnthn para como emular <>o comportamento de raku e observe que o raku .combsem argumento divide uma sequência em caracteres individuais, enquanto o de Perl splitsem argumento está afaik .split(/\s+/)em raku.
raiph 30/03
Uma alternativa .splitseria .words- docs.perl6.org/type/Str#routine_words
donaldh
11
Por que, pela santa cruz, continuo esquecendo o wordsmétodo?
Holli