Bienvenidos sean a este post, en el post anterior hablamos sobre los tipos que puede usar Lua, hemos visto como el lenguaje se adapta dinamicamente en base al contenido almacenado en la variable pero hoy nos centraremos particularmente en uno de estos tipos como son las Strings (cadenas) las cuales se usan para manejar la informacion de tipo texto, comencemos hablando sobre algunas caracteristicas.

Anuncios

Usualmente a este tipo se lo considera una secuencia de caracteres, este lenguaje trabaja con base de 8 bits lo que provoca que podamos almacenar caracter con cualquier base numerica, incluyendo ceros agregados proporcionando la posibilidad de almacenar datos binarios dentro de una cadena.

Las cadenas son valores inmutables, es decir que no podremos cambiar un caracter dentro de una cadena, como podria ser en C y en su lugar, creamos una nueva cadena con las modificaciones necesarias, un ejemplo de esto es lo siguiente:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> a="one string"
> b=string.gsub(a,"one","another")
> print(a)
one string
> print(b)
another string
>

Observen como nosotros utilizamos a gsub, funcion para reemplazar una palabra por otra en una variable, y en este caso modifico la unica coincidencia y agrego el resto de la informacion de a en b. Otra particularidad de Lua es que administra automaticamente la cantidad de memoria por lo que no debemos preocuparnos por la ubicacion de la memoria, por su liberacion, etc., las cadenas en este lenguaje pueden contener desde un caracter hasta un libro por lo que no es raro tener programas que manejen cadenas grandes de informacion, como habran observado los literales se pueden delimitar por medio de comillas simples o comillas dobles:

a = "una cadena"
b = 'otra cadena'
Nota: Se considera literal a la informacion fija y que no puede ser modificada, como se ve en el ejemplo anterior.

Estas dos formas de almacenar los literales es valida para este lenguaje y no genera ninguna diferencia entre ambas. Al igual que puede suceder en otros lenguajes nosotros disponemos de la posibilidad de poder formatear el texto de una cadena, ya sea agregando comillas, una salto de linea, un tabulador, etc, para ello utilizamos una serie de modificadores dentro de la cadena, veamos a continuacion un listado de algunos de ellos o los mas utilizados por nosotos:

ModificadorDescripcion
\aCampana
\bRetroceder un espacio
\fInicio de formulario
\nNueva linea
\rVuelta del carro
\tTabulador horizontal
\vTabulador vertical
\\Barra invertida
\”Comilla doble
\’Comilla simple
Anuncios

Veamos el siguiente ejemplo para comprender mejor a los modificadores:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> print("Una linea\nLa siguiente\tUn tabulador\n\"Con comillas\"")
Una linea
La siguiente    Un tabulador
"Con comillas"
>

Como pueden observar nosotros tomamos un texto simple pero gracias a los modificadores pudimos darle un mejor formato, las mas curiosas son \t que nos permitiria formatear en columnas y las de las comillas para agregarla dentro de nuestras comillas, tambien podemos usar el modificador (\) seguido de hasta tres digitos para representar un caracter, veamos el siguiente ejemplo:

Anuncios
tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> print("\97lo\10\04923")
alo
123
>

Observen como en el primer modificador tomo solo los numeros y lo reemplazo por su equivalente en ASCII, la letra a, luego uso las letras, el siguiente modificador tomo el 10 e hizo el mismo efecto que si hubieramos usado \n porque 10 equivale a ENTER en ASCII y por ultimo como son todo numeros y queremos representar el numero 1 usamos 049 porque al tener detras dos numeros lo tomaria literal y devolveria un error para ello usamos primero 0 y luego los dos digitos que representan al 1, la linea seria equivalente a:

print("alo\n123")

Otra forma de delimitar literales es por medio del doble corchete ([[), por lo menos a mi me lo enseñaron asi, esta forma es ideal para cuando debemos hacer comentarios largos, de esta forma es ideal para multiples lineas pero perderemos el uso de los modificadores antes vistos, una curiosidad es que este formato ignora el primer caracter si es el de nueva linea, un uso muy habitual es para cuando necesitamos escribir piezas de otro programa u otro lenguaje como veremos en el siguiente ejemplo:

Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> page = [[
>> <html>
>> <head>
>> <title>Una pagina HTML</title>
>> </head>
>> <body>
>> <a href="https://tinchicus.com">Tinchicus</a>
>> </body>
>> </html>
>> ]]
>
> write(page)
Anuncios

En ciertas circunstancias puede suceder que trabajemos con variables donde la almacenamos entre corchetes, por ejemplo: a=b[c[i]], noten como se nos formo un doble corchete y esto dentro de un literal como el anterior podria ocasionar un error, para evitar esto se puede usar un signo igual (=) o varios entre los corchetes, por ejemplo: [==[, esto nos permite trabajar con nuestro literal de una forma mas segura pero recuerden que si utilizaron por ejemplo la forma anterior para iniciar el literal deben cerrarlo de la misma forma, es decir ]==], una forma practica para comentar una parte del codigo es –[=[, y para finalizarlo utilicen ]=]

LUA tiene una cualidad unica que es la capacidad de conversiones automaticas entre numeros y cadenas en el momento de ejecucion, tambien poseemos la capacidad de realizar cualquier operacion por medio de conversion entre cadenas y numeros, veamos algunos ejemplos:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> print("10"+2)
12.0
> print("10 + 2")
10 + 2
> print("100" + "2")
102.0
> print("hello" + 1);
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: in ?
>

Observen el primer ejemplo, podemos considerar que el primer datos es de tipo string por estar entre comillas pero a pesar de eso pudo realizar la suma, en el segundo caso no se realizo porque la operacion esta entre comillas y la considera toda una cadena, el tercer caso realizo la operacion a pesar de ser dos cadenas pero en el ultimo caso como la cadena no es numerica no la puede transformar al querer sumarla nos devolvera el error que se muestra, a su vez Lua si encuentra un numero en lugar de una cadena tambien lo transforma en cadena dependiendo de la operacion que queramos realizar:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> print(10 .. 20)
1020
>
Anuncios

Los dos puntos que vemos en el ejemplo son la concatenacion de dos textos, concatenar es la accion de unir dos textos, como pueden ver en lugar de sumar los dos numeros los unio, esto en algunas circunstancias puede ser algo confuso y traer algunos problemas logicos que escapan a los compiladores pero a pesar de poder convertir numeros en cadenas y cadenas en numeros estos son completamente distintos porque si tuvieramos: 10==”10″ nos devolveria un valor false porque no son iguales para poder efectuar una buena conversion se deberia utilizar tonumber() porque tiene la capacidad de devolver un valor nil en caso de que cadena original no puede convertirse en numeros, veamos el siguiente ejemplo:

#! /usr/bin/lua5.3
linea = io.read()
n = tonumber(linea)
if n == nil then
        error(linea .. " no es un numero valido")
else
        print(n*2)
end

En este breve ejemplo vemos como primero le pediremos al usuario que ingrese un valor, puede ser cadena o numero, luego lo convertira en numero por medio de tonumber y lo almacenara en n, en caso de que la nueva variable n tenga un valor igual a nil nos mostrara un mensaje de error en pantalla de lo contrario (else) mostrara el valor duplicado del numero almacenado en n, si lo probamos veremos las siguientes salidas:

tinchicus@dbn001dsk:~/lenguaje/lua$ ./string.lua
hola
/usr/bin/lua5.3: ./string.lua:5: hola no es un numero valido
stack traceback:
        [C]: in function 'error'
        ./string.lua:5: in main chunk
        [C]: in ?
tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3 string.lua
100
200
tinchicus@dbn001dsk:~/lenguaje/lua$
Anuncios

Como pueden ver tenemos los dos casos, primero enviamos un hola el cual a no ser convertido en numero nos muestra los mensajes de error, en el siguiente caso cuando ingresamos el numero se ejecuto correctamente, al igual que en el caso anterior nosotros podemos convertir numeros a cadenas por medio de tostring y para este caso haremos dos ejemplos:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> print(tostring(10) == "10")
true
> print(10 .. "" == "10")
true
>

En este caso tenemos los dos verdaderos porque el primero convirtio un valor numerico en cadena y en el segundo caso concatenamos un valor numerico con caracteres no numericos y lo convirtio en string.

Nota: Recuerden siempre que cuando concatenen numeros alejar los dos puntos (..) porque sino puede tomarlos como decimales y ocasionar un error

Por ultimo vamos a hablar sobre un operador llamado operador de longitud, representado por el numeral (#), el cual nos permite saber la cantidad de caracteres de una variable o un literal, veamos unos ejemplos:

tinchicus@dbn001dsk:~/lenguaje/lua$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> a = "Tinchicus"
> print(#a)
9
> print(#"Hola, Mundo!")
12
>

Como pueden ver tiene la posibilidad de mostrar la cantidad de caracteres ya sea para un literal como para una variable solamente informandola al lado del operador que es el numeral.

Anuncios

En resumen, hoy hemos hablados sobre las cadenas o strings, hemos visto sus particularidades, como formatearlas, como trabajar con ellas, como pueden alternarse dinamicamente con numeros, en sentido contrario, como pueden operarse ya sean numeros o concatenarse con otras cadenas, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00