perl getopt getopt-long

perl - ¿Cómo puedo permitir opciones indefinidas al analizar argumentos con Getopt?



getopt-long (3)

¿No se dejan los valores restantes (sin analizar) simplemente en @ARGV ? Si su contenido adicional comienza con guiones, deberá indicar el final de la lista de opciones con un -- :

#!/usr/bin/perl use strict; use warnings; use Getopt::Long; use Data::Dumper; my $foo; my $result = GetOptions ("foo" => /$foo); print Dumper([ $foo, /@ARGV ]);

Entonces llamando:

my_script.pl --foo -- --WHATEVER

da:

$VAR1 = [ 1, [ ''--WHATEVER'' ] ];

PD. En MooseX::Getopt , las opciones "restantes" de la línea de comandos se colocan en el atributo extra_argv como una referencia de matriz, ¡así que recomiendo la conversión!

Si tengo una línea de comando como:

my_script.pl -foo -WHATEVER

Mi script sabe sobre --foo , y quiero que Getopt establezca la variable $opt_foo , pero no sé nada acerca de -WHATEVER . ¿Cómo puedo decirle a Getopt que analice las opciones sobre las que he hablado, y luego obtener el resto de los argumentos en una variable de cadena o en una lista?

Un ejemplo:

use strict; use warnings; use Getopt::Long; my $foo; GetOptions(''foo'' => /$foo); print ''remaining options: '', @ARGV;

Luego, emitiendo

perl getopttest.pl -foo -WHATEVER

da

Unknown option: whatever remaining options:


Debe configurar la opción "pass_through" a través de Getopt::Long::Configure("pass_through");

Luego admite opciones reales (por ejemplo, cosas que comienzan con "-" y sin el delimitador especial "-" para indicar el final de las opciones "reales").

Aquí está la cita perldoc :

  • pass_through (por defecto: deshabilitado)

    Las opciones que son desconocidas, ambiguas o provistas con un valor de opción no válido se pasan a través de @ARGV en lugar de @ARGV como errores. Esto hace posible escribir scripts de envoltura que procesan solo parte de los argumentos de la línea de comandos provistos por el usuario, y pasar las opciones restantes a algún otro programa.

Aquí un ejemplo

$ cat my_script.pl #!/usr/local/bin/perl5.8 -w use Getopt::Long; Getopt::Long::Configure("pass_through"); use Data::Dumper; my %args; GetOptions(/%args, "foo") or die "GetOption returned 0/n"; print Data::Dumper->Dump([/@ARGV],["ARGV"]); $ ./my_script.pl -foo -WHATEVER $ARGV = [ ''-WHATEVER'' ];


Pienso que la respuesta aquí, lamentablemente, es "no, no hay una manera de hacerlo exactamente como lo pides, usando Getopt :: Long, sin analizar @ARGV por tu cuenta". Ether tiene una solución decente, sin embargo. Es una característica en la medida en que a la mayoría de las personas les preocupa que cualquier argumento similar a una opción se capture como un error. Normalmente puedes hacer

GetOptions(''foo'' => /$foo) or die "Whups, got options we don''t recognize!";

para capturar / evitar que se pasen opciones extrañas, y luego puede corregir el uso del usuario. Alternativamente, puedes simplemente pasarlos e ignorarlos.