Puede Getopt de Perl :: larga analizar argumentos que no definen de antemano?
-
22-08-2019 - |
Pregunta
Yo sé cómo usar Getopt :: largo de Perl, pero no estoy seguro de cómo me puedo configurarlo para aceptar cualquier "--key = valor" pareja que no se ha definido de forma explícita y pegarlo en un hash. En otras palabras, no sé de antemano qué opciones que el usuario puede desear, por lo que no hay manera para mí definir todos ellos, sin embargo, yo quiero ser capaz de analizar a todos.
Sugerencias? Gracias de antemano.
Solución
El Getopt::Long
documentación sugiere una opción de configuración que podría ayudar:
pass_through (default: disabled)
Options that are unknown, ambiguous or supplied
with an invalid option value are passed through
in @ARGV instead of being flagged as errors.
This makes it possible to write wrapper scripts
that process only part of the user supplied
command line arguments, and pass the remaining
options to some other program.
Una vez que se analizan las opciones regulares, se puede usar un código como que proporcionada por RunRig para analizar las opciones ad hoc.
Otros consejos
Getopt :: larga no hace eso. Puede analizar las opciones de ti mismo ... por ejemplo.
my %opt;
my @OPTS = @ARGV;
for ( @OPTS ) {
if ( /^--(\w+)=(\w+)$/ ) {
$opt{$1} = $2;
shift @ARGV;
} elsif ( /^--$/ ) {
shift @ARGV;
last;
}
}
o modificar Getopt :: largo manejarlo (o modificar el código anterior para manejar más tipos de opciones si necesita eso).
Soy un poco parcial, pero he utilizado Getopt :: Todo lo que en el pasado para analizar los argumentos desconocidos.
Potencialmente, se podría utilizar el " Opciones con valores hash " característica.
Por ejemplo, quería para permitir a los usuarios configurar los filtros arbitrarios al analizar a través de una matriz de objetos.
GetOptions(my $options = {}, 'foo=s', 'filter=s%')
my $filters = $options->{filter};
Y luego llamarlo como
perl ./script.pl --foo bar --filter baz=qux --filter hail=eris
Lo cual construir algo como ..
$options = {
'filter' => {
'hail' => 'eris',
'baz' => 'qux'
},
'foo' => 'bar'
};
Y, por supuesto filtros $ tendrán el valor asociado con el 'filtro'
Buena suerte! Espero que alguien encontró útil esta información.
Desde el documentación :
argumento de devolución de llamada
Una opción
<>
especial 'nombre' puede ser utilizado para designar una subrutina para manejar argumentos que no sean opciones. CuandoGetOptions()
se encuentra con un argumento que no se ve como una opción, se llamará de inmediato esta subrutina y lo pasa un parámetro: el nombre del argumento.Bueno, en realidad se trata de un objeto que stringifies al nombre del parámetro.
Por ejemplo:
my $width = 80; sub process { ... } GetOptions ('width=i' => \$width, '<>' => \&process);Cuando se aplica a la línea de comandos:
arg1 --width=72 arg2 --width=60 arg3Para ello, será
process("arg1")
mientras$width
es 80, mientras queprocess("arg2")
$width
es 72, yprocess("arg3")
mientras$width
es 60.Esta característica requiere una configuración opción permute, ver sección "Configuración Getopt :: Long".
Este es un buen momento para rodar su propia opción del analizador. Ninguno de los módulos que he visto en el CPAN proporcionar este tipo de funcionalidad, y siempre se podía mirar a sus implementaciones de conseguir un buen sentido de cómo manejar los aspectos prácticos de análisis.
Como acotación al margen, este tipo de código hace que me gusta Getopt variantes:
use Getopt::Long;
&GetOptions(
'name' => \$value
);
La capitalización es inconsistente exasperante, incluso para las personas que han visto y utilizado este tipo de código para un largo tiempo.