Quel est le moyen le plus simple de lire par programmation à partir de stdin ou d'un fichier d'entrée (si fourni) en Perl?
while (<>) {
print;
}
lira soit à partir d'un fichier spécifié sur la ligne de commande, soit à partir de stdin si aucun fichier n'est donné
Si cette construction de boucle est requise en ligne de commande, vous pouvez utiliser -n
option:
$ Perl -ne 'print;'
Ici vous venez de mettre le code entre {}
du premier exemple dans ''
en seconde
Ceci fournit une variable nommée avec laquelle travailler:
foreach my $line ( <STDIN> ) {
chomp( $line );
print "$line\n";
}
Pour lire un fichier, dirigez-le comme ceci:
program.pl < inputfile
Dans certains cas, la méthode la plus simple consiste à tirer parti du commutateur -n
_) . Il enveloppe implicitement votre code avec une boucle while(<>)
et gère les entrées de manière flexible.
Dans slickestWay.pl
:
#!/usr/bin/Perl -n BEGIN: { # faire quelque chose une fois ici # mettre en oeuvre la logique pour une seule ligne d’entrée print $ result;
En ligne de commande:
chmod +x slickestWay.pl
Maintenant, en fonction de votre contribution, effectuez l’une des opérations suivantes:
Attendre la saisie de l'utilisateur
./slickestWay.pl
Lire des fichiers nommés en arguments (aucune redirection requise)
./slickestWay.pl input.txt
./slickestWay.pl input.txt moreInput.txt
Utiliser un tuyau
someOtherScript | ./slickestWay.pl
Le bloc BEGIN
est nécessaire si vous devez initialiser une sorte d’interface orientée objet, telle que Text :: CSV ou une telle interface, que vous pouvez ajouter au Shebang avec -M
.
-l
et -p
sont également vos amis.
Vous devez utiliser l'opérateur <>:
while (<>) {
print $_; # or simply "print;"
}
Qui peut être compacté à:
print while (<>);
Fichier arbitraire:
open F, "<file.txt" or die $!;
while (<F>) {
print $_;
}
close F;
Faire
$userinput = <STDIN>; #read stdin and put it in $userinput
chomp ($userinput); #cut the return / line feed character
si vous voulez lire une seule ligne
Voici comment j’ai créé un script qui peut utiliser des entrées de ligne de commande ou faire rediriger un fichier texte .
if ($#ARGV < 1) {
@ARGV = ();
@ARGV = <>;
chomp(@ARGV);
}
Cela réaffectera le contenu du fichier à @ARGV, à partir de là vous ne ferez que @ARGV comme si quelqu'un incluait des options de ligne de commande .
ATTENTION
Si aucun fichier n'est redirigé, le programme restera inactif car il attend l'entrée de STDIN .
Je n'ai pas trouvé de moyen de détecter si un fichier est en cours de redirection pour encore éliminer le problème STDIN.