Entrada de Datos. Lua
SOLUCIONARIO
Entrada de Datos. Lua
2026-07-19
Por
Occam's Razor

#!/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] .. " ")
end

Lua 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:

  • *n o *number. Lee un número si existe o nil en caso contrario
  • *a o *all. Lee todo el fichero en una sola llamada
  • *l o *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.

SOY NOVATO

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 a table[#table+1] = num que 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)
end

El 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).

¿SABÍAS QUÉ?

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.

¿SABÍAS QUÉ?

A partir de Lua 5.3 podemos utilizar math.type(num) para determinar el tipo de número que es num (entero o decirmal), sin embargo, puede ser que un número como 3.0 sea 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 gmatch nos permite hacerlo de forma muy sencilla.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)