2010-03-02 13 views
8

No sé muy bien Ruby, pero estoy intentando agregar algunas funcionalidades a este script que escribió un compañero de trabajo.Cómo usar los argumentos variables con OptionParser de Ruby

Básicamente, en este momento se necesitan algunos indicadores y estándar como entrada, y utiliza OptionParser para analizar los indicadores.

Deseo utilizar OptionParser para analizar una selección de argumentos de línea de comandos similares a los de cat. Así que supongo que mi pregunta es ¿cómo iba a escribir las opciones de línea de comandos de análisis sintáctico parte de gato en el uso de rubí OptionParser

cat [OPTION]... [FILE]... 

esperanza que tiene sentido, cualquier ayuda se agradece.

+0

¿Está preguntando cómo lidiar con los argumentos de no conmutación ([ARCHIVO])? –

+0

Sí, pude escribir código para todas las opciones de cambio, pero no sé cómo lidiar con la cantidad infinita de archivos enumerados después de eso. Lo siento, no estaba claro. – icco

+0

Lo siento, he actualizado mi respuesta. Después de analizar todas las opciones, debe quedar ARGV como una matriz de nombres de archivos. Suponiendo que el usuario ha ingresado una línea de comando válida, eso es. – Shadowfirebird

Respuesta

8
OPTS = {} 

op = OptionParser.new do |x| 
    x.banner = 'cat <options> <file>'  
    x.separator '' 

    x.on("-A", "--show-all", "Equivalent to -vET")    
     { OPTS[:showall] = true }  

    x.on("-b", "--number-nonblank", "number nonempty output lines") 
     { OPTS[:number_nonblank] = true }  

    x.on("-x", "--start-from NUM", Integer, "Start numbering from NUM")   
     { |n| OPTS[:start_num] = n } 

    x.on("-h", "--help", "Show this message") 
     { puts op; exit } 

end 

op.parse!(ARGV) 

# Example code for dealing with filenames 
ARGV.each{ |fn| output_file(OPTS, fn) } 

¡Dejaré otras operaciones de línea de comandos, como dicen, como un ejercicio para el lector! Entiendes la idea.

(NB: tuve que inventar un parámetro -x ficticia de demostración pasando un valor después de una bandera.)

Actualización: Me debería haber explicado que esto dejará ARGV como una matriz de nombres de archivo, en el supuesto de que la el usuario ha ingresado cualquiera.

+0

Así que el problema con esto es que solo admite un archivo. Lo que estoy tratando de averiguar es cómo lidiar con el hecho de que hay 4 archivos en la línea de comando. Digamos una llamada como "cat a.txt b.txt c.txt d.txt". – icco

+1

No, ARGV debería ser una matriz con un elemento para cada palabra que queda en la línea de comando después de procesar las opciones. En tu ejemplo, tendría cuatro elementos. – Shadowfirebird

+2

@icco 'pone ARGV.inspect # => [" a.txt "," b.txt "," c.txt "," d.txt "]' –

Cuestiones relacionadas