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.