El manejo de los argumentos de la línea de comandos se realiza a través del arreglo incorporado @ARGV, que contiene todos los parámetros pasados al script al iniciarlo (excepto el nombre del propio script). Este es el método básico para cualquier aplicación CLI en Perl, pero tiene muchos matices relacionados con los tipos de datos, la codificación, la separación de parámetros y los escollos del autoleído de archivos.
Desde las primeras versiones de Perl, el arreglo @ARGV ha sido el "punto de entrada" estándar para los argumentos de inicio, análogo a argv[] en C. Sin embargo, Perl, siendo un lenguaje de propósito general y de tareas textuales, ha añadido muchos trucos adicionales: por ejemplo, la expresión <>, que está "conectada" con el contenido de @ARGV, permitiendo leer de inmediato archivos enumerados como argumentos.
La lectura trivial de @ARGV es adecuada solo para casos simples. En programas CLI complejos, aparece la necesidad de manejar opciones (como --help, -o file). Aquí, la simple lectura de datos por índices se vuelve poco segura e incómoda. Se vuelve aún más complicado manejar argumentos que contienen espacios, caracteres no estándar o diferentes codificaciones. Además, hay cuestiones sobre la apertura automática de archivos a través del operador <> y comportamientos inesperados si los elementos de @ARGV son, por ejemplo, "-" (stdin).
Lectura de argumentos simples:
foreach my $arg (@ARGV) { print "Arg: $arg "; }
Normalmente se utiliza un módulo especial para las opciones Getopt::Long:
use Getopt::Long; my $help; GetOptions('help' => \$help);
Para leer todos los archivos de @ARGV, se puede leer el contenido de los archivos de inmediato a través de un ciclo:
while (<>) { print; }
¿Qué pasará si uno de los argumentos de la línea de comandos contiene solo un guion (-)?
En este caso, al usar el operador <>, Perl interpreta '-' como entrada estándar (stdin), y no como el nombre de un archivo.
perl script.pl - file.txt # Lectura primero desde stdin, luego desde file.txt
¿Se puede modificar @ARGV de forma segura dentro del script?
Sí, esta es una práctica estándar para eliminar argumentos ya procesados. Generalmente, después de procesar las opciones, se dejan en @ARGV solo los nombres de archivos "limpios" o parámetros no reconocidos.
¿Es necesario hacer encode/decode al trabajar con argumentos UTF-8 en @ARGV?
Esto depende de la configuración regional y el entorno. Por defecto, Perl no convierte las codificaciones de @ARGV, sino que las acepta "tal como están". Por lo tanto, si los nombres de archivos (o parámetros) contienen caracteres no-ASCII, es recomendable decodificar las cadenas explícitamente usando Encode, si se requiere trabajar con ellas en Perl.
Una herramienta para analizar registros acepta una lista de archivos. El usuario accidentalmente especifica '-':
perl parse.pl - access.log
como resultado, el programa se detuvo inesperadamente y espera la entrada desde el teclado.
Pros:
Contras:
Una aplicación CLI lee argumentos a través de Getopt::Long, maneja explícitamente todas las opciones de guion, dejando en @ARGV solo los nombres de archivos:
perl report.pl --input access.log --output report.txt
Pros:
Contras: