Comment puis-je mélanger les arguments de ligne de commande et les noms de fichiers pour <> en Perl?

StackOverflow https://stackoverflow.com/questions/2344926

  •  23-09-2019
  •  | 
  •  

Question

Considérons le programme Perl stupide suivant:

$firstarg = $ARGV[0];

print $firstarg;

$input = <>;

print $input;

je le lance à partir d'un terminal comme:

perl myprog.pl sample_argument

Et obtenir cette erreur:

Can't open sample_argument: No such file or directory at myprog.pl line 5.
Toutes les idées pour lesquelles cela est

? Quand il arrive à la <> est-il tente de lire à partir du fichier (inexistant), « sample_argument » ou quelque chose? Et pourquoi?

Était-ce utile?

La solution

<> est un raccourci pour « lire des fichiers spécifiés dans @ARGV, ou si @ARGV est vide, lire STDIN ». Dans votre programme, @ARGV contient la ("sample_argument") de valeur, et ainsi de Perl essaie de lire ce fichier lorsque vous utilisez l'opérateur <>.

Vous pouvez y remédier en compensation @ARGV avant d'arriver à la ligne <>:

$firstarg = shift @ARGV;
print $firstarg;
$input = <>;       # now @ARGV is empty, so read from STDIN
print $input;

Autres conseils

Voir la page de manuel perlio, qui se lit en partie:

Le descripteur de fichier null <> est spécial: il peut être utilisé pour imiter le comportement de sed et awk. L'entrée de <> provient soit de l'entrée standard, ou de chaque fichier répertorié sur la ligne de commande. Voici comment cela fonctionne: la première fois <> est évaluée, la @ARGV tableau est cochée, et si elle est vide, $ ARGV [0] est réglé sur « - » que, ouvert vous donne l'entrée standard. Le tableau @ARGV est ensuite traitée comme une liste de noms de fichiers.

Si vous voulez STDIN, utilisez stdin, pas <>.

Par défaut, les arguments perl consomme de ligne de commande sous forme de fichiers d'entrée pour <>. Une fois que vous les avez utilisés, vous devez vous les consommer avec shift;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top