2008-09-22 12 views
7

Tengo una cadena con posibles argumentos de línea de comando (usando un programa Read-Eval-Print-Loop) y deseo que se analice de manera similar a los argumentos de la línea de comandos cuando se pasa a Getopt :: Long.¿Cómo analizo una cadena con GetOpt :: Long :: GetOptions?

Elaborar:

tengo una cadena

$str = '--infile /tmp/infile_location --outfile /tmp/outfile' 

quiero que sea analizado por getOptions para que sea más fácil para mí para añadir nuevas opciones.

Una solución que podría pensar es dividir la cadena en espacios en blanco y reemplazar @ARGV con nueva matriz y luego llamar a GetOptions. algo así como ...

my @arg_arr = split (/\s/, $input_line); 

# This is done so that GetOptions reads these new arguments 
@ARGV = @arg_arr; 
print "ARGV is : @ARGV\n"; 
GetOptions (
      'infile=s' => \$infile, 
      'outfile=s' => \$outfile 
      ); 

¿Hay alguna buena/mejor manera?

Respuesta

7

En lugar de dividir en espacios en blanco, use la función glob incorporada. Además de dividir en espacios en blanco, eso hará las expansiones de línea de comando estándar, luego devolverá una lista. (Por ejemplo * daría una lista de archivos, etc.) También recomendaría local-izing @ARG en principio general.

Aparte de eso, esa es la única forma en que puede hacerlo sin volver a escribir GetOptions. (Es evidente que tengo que leer la documentación con más cuidado.)

5

¡Guau!

creo que puedo usar ambas respuestas bentilly y dinomite de y hacer lo siguiente:

  • uso pegote para llevar a cabo la línea de comandos estándar expansiones
  • pasar la matriz después de pegote al método GetOptionsFromArray del Getopt :: de largo (ver here)

Código puede ser algo como ...

GetOptionsFromArray ([glob ($input_line)]); 

Y esa es solo una línea ... genial (sé que tengo que hacer algunas comprobaciones de errores, etc.) ... pero es genial ...

+0

El primer argumento es una referencia de matriz, por lo que desea "GetOptionsFromArray ([glob ($ input_line)], ...)" –

+0

Gracias Michael ... aquí va el cambio en el código ... – Jagmal

0

Cuando usa Getopt :: Long en algo que no sea la entrada del usuario, tenga en cuenta que algunas características son diferentes en función de la variable de entorno POSIXLY_CORRECT. Puede anular esto con la llamada apropiada para configurar.

Obligatory POSIXLY_CORRECT anecdote.

0

Parece que los métodos GetOptionsFromArray y GetOptionsFromString se agregaron solo en v2.36 y Murphy diría que solo tengo la versión 2.35.

Por ahora, creo que tendré que vivir con @ARGV local.

Cuestiones relacionadas