Alternative à Perl's <> à Raku?


11

Ici j'apprends mon chemin autour de Raku (neé Perl 6), très sympa tout autour. Mais la magie <>de Perl 5 me manque cruellement , où vous pouvez simplement:

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

(lire la ligne d'entrée suivante dans $x, faire une boucle sur le reste; l'entrée provient des fichiers nommés comme entrée ou entrée standard si aucun fichier n'est fourni). Les tutoriels / guides de migration "Perl 5 à 6" / ... parlent simplement de slurpl'intégralité du fichier ou opendes fichiers individuels par nom. Pas de magie "prendre l'entrée des fichiers nommés dans l'ordre" que je peux trouver.

Je veux retrouver la magie!

Réponses:


17

La fonctionnalité que vous recherchez existe largement. Ce script:

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

Compte tenu de ces fichiers d'entrées:

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

Will, lorsqu'il est invoqué comme:

raku script.p6 foo bar

Produisez la sortie:

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

Il prendra également la sortie de $*INs'il n'y a pas de fichiers. La seule chose qui n'existe pas est un seul remplacement <>, car cela dépendrait d'une wantarrayfonctionnalité similaire à celle qui est incompatible avec la répartition multiple (et Raku considère que la répartition multiple est beaucoup plus utile).

Les candidats sans argument pour getet linessont implémentés en termes de$*ARGFILES , un descripteur de fichier qui fournit la fonctionnalité de prendre les fichiers de la liste d'arguments ou de $*IN- ce qui signifie que l'on peut le transmettre à n'importe quel code qui attend un descripteur de fichier.


1
ou, pédantiquement: raku script.raku foo bar. ;-)
p6steve

0

Assez de magie pour vous?

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

2
C'est cool, et OP devrait l'essayer, mais ce n'est pas la même chose à plusieurs égards. Voir la réponse de jnthn pour savoir comment émuler <>le comportement de, et notez que raku .combsans argument divise une chaîne en caractères individuels, tandis que Perl splitsans argument est, afaik, .split(/\s+/)en raku.
raiph

Une alternative à .splitserait .words- docs.perl6.org/type/Str#routine_words
donaldh

1
Pourquoi, par le saint rngesus, est-ce que j'oublie toujours la wordsméthode?
Holli
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.