¿Cómo puedo mezclar argumentos y nombres de archivo de línea de comandos para <> en Perl?

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

  •  23-09-2019
  •  | 
  •  

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é?

¿Fue útil?

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;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top