#!/usr/bin/lua
print ("Introduce dos numeros separados por un espacio ? ")
n, t = io.read ("*n", "*n")
print ("Has introducido ", n, " y ", t, "\n")
print ("Introduce 10 numeros separados por spacios ? ")
w= {}
for i=0, 9 do
w[i] = io.read("*n")
end
for i=0, 9 do
io.write (w[i] .. " ")
endLua pertenece al grupo de lenguajes que hacen uso de cadenas de formato (format strings), para leer, procesar y convertir datos de usuario. Sin embargo, la solución de Lua es más sencilla que la estándar proporcionada por C y que muchos otros lenguajes siguen.
En Lua, las cadenas de formato que podemos pasar a
io.read son las siguientes:
*no*number. Lee un número si existe onilen caso contrario*ao*all. Lee todo el fichero en una sola llamada*lo*line. Lee una la siguiente línea del fichero- num. Lee una cadena de hasta num bytes del fichero
El uso de *n nos permite validar muy fácilmente la
entrada cuando intentamos leer números ya que realiza la conversión y
nos devolverá nil en case de que lo que hayamos leído no se
trate de un número.
En nuestro ejemplo estamos insertando los valores numéricos en posiciones específicas en el array, puesto que estamos trabajando con un número fijo de valores. Sin embargo, Lua nos ofrece otras dos posibilidades para añadir elementos a un array (o tabla que es lo mismo a fin de cuentas), de forma más general, es decir, sin tener que llevar la cuenta de cuantos elementos tenemos ni de donde debemos insertar.
La primera opción es usar
table.insert (w, num). Este método es equivalente atable[#table+1] = numque viene a ser algo así como inserta número en el último elemento del array. Ambas opciones, a diferencia del acceso directo que usamos en le programa, nos permiten añadir elementos y actualizar el tamaño del array de forma sencilla
Al igual que hemos visto con otros lenguajes, si queremos tener un control fino de los valores introducidos y poder hacer comprobaciones específicas sobre ellos, debemos proceder leyendo la línea de caracteres completa y luego extrayendo cada uno de los componentes para llevar a cabo la comprobación pertinente. Para nuestro caso de leer 10 números, el código seria algo como esto.
local line = io.read()
local numbers = {}
for token in line:gmatch("%S+") do
local num = tonumber(token)
if not num or num % 1 ~= 0 then
error("Invalid integer: " .. token)
end
table.insert(numbers, num)
end
-- Print them
for i, v in ipairs(numbers) do
print(i, v)
endEl código lee la linea completa con io.read() y luego la
divide en subcadenas usando el método gmatch. El patrón
%S+ significa que nos devuelva secuencia compuesta por uno
o más (eso significa el +) caracteres que no sean espacio
(s significa espacio y S lo contrario).
Como en la mayoría de lenguajes soportando este tipo de expresiones regulares/patrones, el espacio en blanco no solo representa los espacios, sino que también incluye tabuladores y retornos de carro. Esto es así porque Lua utiliza internamente la función estándar de C
isspace
Una vez que tenemos cada uno de los tokens separados por espacios,
intentamos convertirlos en números usando la función
tonumber, la cual nos devolverá nil si la
cadena no se puede convertir en un número. Observad que la segunda parte
de la comprobación en el código de ejemplo anterior
(num %1 ~=0) es solo para comprobar si el número es
entero.
A partir de Lua 5.3 podemos utilizar
math.type(num)para determinar el tipo de número que esnum(entero o decirmal), sin embargo, puede ser que un número como3.0sea reportado como entero (puesto que realmente es entero) por unas versiones de Lua y como decimal por otras. La comprobación del módulo no se presta a estas ambigüedades.
Si necesitas llevar a cabo comprobaciones más complejas sobre la
entrada del usuario, la función match te permite
comprobarla usando expresiones regulares. A deferencia de
gmatch que devuelve todas las ocurrencias de la expresión
regular de forma secuencial, match solo devuelve la primera
ocurrencia.
RESUMEN
- Podemos leer datos en nuestros programas usando
io.read()muy fácilmente - La validación de tipos sencillos como números la podemos hacer
directamente al leer los datos o usando funciones como
tonumber. - Para validaciones más complejas lo habitual es trocear la línea de
entrada y procesar cada uno de los tokens según lo que necesitemos. El
método
gmatchnos permite hacerlo de forma muy sencilla.
■
