¿Cómo puedo mezclar argumentos y nombres de archivo de línea de comandos para <> en Perl?
Pregunta
Considere el siguiente programa tonta Perl:
$firstarg = $ARGV[0];
print $firstarg;
$input = <>;
print $input;
lo ejecuto desde un terminal como:
perl myprog.pl sample_argument
Y conseguir este error:
Can't open sample_argument: No such file or directory at myprog.pl line 5.
Cualquier idea por qué es esto? Cuando se llega a la <> que está intentando leer desde el archivo (inexistente), "sample_argument" o algo así? Y por qué?
Solución
<>
es la abreviatura de "lectura de los archivos especificados en @ARGV
, o si @ARGV
está vacío, entonces leer de STDIN
". En su programa, @ARGV
contiene el ("sample_argument")
valor, y así Perl intenta leer del archivo cuando se utiliza el operador <>
.
Se puede solucionarlo por @ARGV
claro antes de que llegue a la línea de <>
:
$firstarg = shift @ARGV;
print $firstarg;
$input = <>; # now @ARGV is empty, so read from STDIN
print $input;
Otros consejos
Vea la página del manual perlio, que dice en parte:
El gestor de archivo nula <> es especial: se puede utilizar para emular el comportamiento de sed y awk. El aporte de <> viene o de la entrada estándar, o de cada archivo de la lista en la línea de comandos. He aquí cómo funciona: la primera vez <> se evalúa, la @ARGV matriz está marcada, y si está vacío, $ argv [0] está ajustado a "-", que cuando se abierto le da entrada estándar. La matriz @ARGV se procesa como una lista de los nombres de archivo.
Si desea STDIN, el uso STDIN, no <>
.
Por defecto, consume Perl los argumentos de línea de comandos como archivos de entrada para <>
. Después de haberlos usado, usted debe consumirlos usted mismo con shift;