web-dev-qa-db-fra.com

Lecture programmée à partir de STDIN ou d'un fichier d'entrée en Perl

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?

61
syker
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

76
ennuikiller

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
41
Ron

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:

  1. Attendre la saisie de l'utilisateur

    ./slickestWay.pl
    
  2. Lire des fichiers nommés en arguments (aucune redirection requise)

    ./slickestWay.pl input.txt
    ./slickestWay.pl input.txt moreInput.txt
    
  3. 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.

14
Neil Best

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;
12
el.pescado

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

6
Thorsten Niehues

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. 

0
Westrock