Comment puis-je mélanger les arguments de ligne de commande et les noms de fichiers pour <> en Perl?
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?
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;