#!/usr/bin/ruby -w
puts "#{ARGV.size } Parameters"
= 1
i ARGV.each do |a|
puts "Parameter #{i} : #{a}"
= i + 1
i end
if ARGV.size != 1
puts "Only one parameter Please"
end
Ruby, nos muestra la influencia de Perl en el lenguaje, utilizando el
mismo enfoque. Los parámetros se pasan en un array de nombre
ARGV
. De la misma forma que Perl, Ruby no almacena el
nombre del programa en la primera entrada del array, sino que lo
proporciona en una variables especial… la cual, curiosamente, recibe el
mismo nombre que en Perl $0
.
¿SABÍAS QUÉ?
Como sucede en otros muchos lenguajes, Ruby te permite modificar el nombre con el que aparece el script en la salida de
ps
modificando la variable global$0
. Tan fácil como:#!/usr/bin/ruby $0 = "Este no es mi nombre"
A diferencia de Perl, Ruby es un lenguaje orientado a objetos en el
que todo es un objeto, así que la forma de obtener el tamaño del array
(el número de parámetros que pasamos al script) es invocando el método
size
o length
(size
es un alias
de length
así que se pueden usar cualquiera de ellos).
Puesto que ARGV
es un array en Ruby, podemos iterar a lo
largo de sus elementos usando el método each
de la forma
indicada en el código de arriba o como vimos en el capítulo sobre
bucles.
SOY NOVATO
Al igual que Perl, Ruby nos permite acceder a las variables de entorno a través de una tabla hash llamada
ENV
Como sucede con muchos de los otros lenguajes que ya hemos visto,
Tuby ofrece varios módulos para poder procesar argumentos de la línea de
comandos muy fácilmente. Uno de los más clásicos es
GetoptLong
(como ya os podíais imaginar), si bien
optparser
es una de las opciones más utilizadas. Para que
resulte más sencillo comparar el ejemplo con otros lenguajes
utilizaremos GetoptLong
, sin embargo, para el caso de Ruby
no es la mejor opción.
El programa tendrá una pinta como esta:
#!/usr/bin/ruby
require 'getoptlong'
= GetoptLong.new(
opts [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
[ '--input', '-i', GetoptLong::REQUIRED_ARGUMENT ],
[ '--output', '-o', GetoptLong::REQUIRED_ARGUMENT ]
)
= "output.txt"
ofile = "input.txt"
ifile .quiet = true # Elimina errores por defecto
opts
begin
.each do |opt, arg|
optscase opt
when '--help' then puts "Ayuda para el programa"
when '--input' then ifile = arg
when '--output' then ofile=arg
end
end
rescue Exception => err
puts ">>#{err.class()}: #{err.message}"
puts "Uso: #{$0} [--help] [--input file] [--output file]"
exit
end
print ("Copiando #{ifile} a #{ofile}\n")
Como podéis ver GetoptLong
nos permite escribir
rápidamente código para procesar la línea de comandos, incluyendo
opciones cortas, largas además de poder especificar si las opciones
necesitan parámetros o no.
SOY NOVATO
El módulo
GetoptLong
en Ruby nos informa de los errores lanzando una excepción. Por esa razón, el bucle que recorre las opcionesopts.each...
esta incluido en un bloquebegin... rescue
. En el bloquerescue
podemos procesar los errores tales como, argumento no proporcionado u opción desconocida.
GetoptLong
incluye algunas opciones más para poder
controlar si queremos permitir la repetición de opciones o si queremos
forzar un determinado orden de las opciones.
Resumen
- Ruby recibe los parámetros en un array llamado
ARGV
como cadenas de caracteres $0
es una variable especial que contiene el nombre del programa. Esta variable se puede modificar- El módulo
GetoptLong
permite procesar parámetros de la línea de comandos de fácil y sencilla. Requiere el uso de excepciones para manejar los errores.
■