Puede Getopt de Perl :: larga analizar argumentos que no definen de antemano?

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

  •  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.

¿Fue útil?

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. Cuando GetOptions() 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 arg3

Para ello, será process("arg1") mientras $width es 80, mientras que process("arg2") $width es 72, y process("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.

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