Bienvenidos sean a este post, hoy comenzaremos con otra de las librerias estandard como es string, la cual se encarga de manipular las cadenas o textos de nuestros programas.

Anuncios

A lo largo de los posts anteriores hemos visto varias funciones que hemos aplicado para nuestras cadenas, a lo largo de los siguientes iremos viendo especificamente cada una de ellas pero en el caso de hoy nos centraremos en las funciones basicas de la misma y para ello listemos algunas simples y que hemos visto:

  • string.len(s), devuelve la longitud de s
  • string.rep(s,n), devuelve la cadena s repetida n veces, una alternativa a esta expresion es s:rep(n)
  • string.lower(s), convierte toda la cadena s a minusculas
  • string.upper(s), igual a la anterior pero todo en mayusculas
Anuncios

Un ejemplo que podriamos usar para testeo seria crear un cadena de 1 MB por medio de esta funcion:

string.rep("a", 2 ^ 20) 
Anuncios

En este caso repetiremos la letra a la cantidad informada en el exponencial, otro tipico uso es si queres ordenar un array sin interesarte en su tamaño, podriamos escribir algo asi:

table.sort(a, function(a,b)
	return string.lower(a) < string.lower(b)
end)
Anuncios

Tanto string.upper como string.lower siguen la localizacion actual por lo tanto si trabajas con la ubicacion European Latin – 1 la expresion:

string.upper("acción") // resultara en "ACCIÓN" 

Nuestra siguiente funcion es:

string.sub(s, i, f) 
Anuncios

La cual extrae una porcion de la cadena s conformada por la posicion informada entre i y f, una alternativa interesante es utilizar numeros negativos porque la funcion interpreta que debe contar la cantidad informada desde la ultima posicion de la cadena, por ejemplo -1 significa que es el ultimo caracter, -2 simboliza al penultimo y asi sucesivamente, otra forma de llamarlo es:

s:sub(i,f) 
Anuncios

Veamos el siguiente ejemplo:

> a = "[en corchetes]"
> print(string.sub(a,2,-2))
en corchetes
>
Anuncios

En este caso podemos ver como nos devolvio el mensaje con el primer y ultimo caracter removido, en este caso solo el texto, recuerden que Lua empieza a contar desde 1 y no desde 0 y que las cadenas son inmutables, esta funcion al igual que cualquier otra en Lua no cambia el valor de la cadena pero devuelve una nueva cadena, un error comun es asumir que la siguiente expresion va a cambiar el valor de una cadena:

string.sub(s, 2, -2)
Anuncios

Pero para ello debemos asignar el nuevo valor a esa cadena:

s = string.sub(s. 2. -2)
Anuncios

Las funciones string.char y string.byte convierten entre caracteres y su representacion numerica interna, la funcion string.char obtiene cero o mas enteros, convierte cada uno a un caracter y devuelve una cadena concatenando todos estos caracteres, la funcion:

string.byte(s, i) 
Anuncios

Devuelve la representacion numerica de la posicion informada en i de la cadena s, si bien este argumento es opcional porque podriamos llamar directamente string.byte(s) devuelve la representacion numerica interna del primer (o unico) caracter de s, vamos a asumir que en los siguiente ejemplos estan representados en ASCII:

> print(string.char(97))
a
> i = 99; print(string.char(i, i + 1, i + 2))
cde
> print(string.byte("abc"))
97
> print(string.byte("abc", 2))
98
> print(string.byte("abc", -1))
99
>
Anuncios

Como pueden ver en el primer caso convirtio el valor en el elemento ASCII correspondiente, en el segundo creamos un valor de i, luego cuando lo imprimimos nos representa cada valor informado y los concatena automaticamente, en el caso de las string.byte si no informamos ninguno devuelve el codigo del primer caracter, en el segundo como dijimos una ubicacion nos devuelve ese valor y en el ultimo caso le dijimos que nos devuelva el valor del ultimo caracter, a partir de la version 5.1 string.byte soporta un tercer argumento, una llamada como string.byte(s, i, f) nos puede devolver multiples valores con la representacion numerica de todos los caracteres en el rango informado entre i y f (inclusive):

> print(string.byte("abcdefg",2,5))
98      99      100     101
>
Anuncios

El valor predeterminado de f es i, si este no es informado, asi que un llamado sin este argumento devuelve solamente el caracter de la posicion informada en i, una opcion de esta funcion es:

{s:byte(1, -1)} 

La cual crea una tabla con todos los caracteres de la cadena s, dada esta tabla podemos representar la cadena original llamando a:

string.char(unpack(s)) 

Aunque desgraciadamente estas tecnicas no funcionan para cadenas largas (cualquiera mas larga de 2 KB) porque Lua pone un limite en cuantos valores una funcion puede retornar.

Anuncios

La funcion string.format es una herramienta poderosa para el formateo de salida de cadenas, devuelve una version formateada de su numero variable de argumentos siguiendo la descripcion dada por el primer argumento, la asi llamada cadena de formato, la cadena de formato tiene reglas similares a la funcion printf del estandar de C, esta compuesto de texto comun y directivas las cuales controlan donde y como cada argumento debe estar ubicado en la cadena formateada.

Anuncios

Una directiva es el caracter de porcentaje (%) seguido de una letra que informa como se debe formatear la cadena:

  • d, para numeros decimales
  • x, para numeros hexadecimales
  • o, para numeros octales
  • f, para numeros flotantes
  • s, para cadenas
Anuncios

Entre el caracter % y la letra la directiva pueden incluir otras opciones que controlan los detalles del formato, tales como el numero de digitos decimales de un numero de punto flotante:

> print(string.format("pi = %.4f", math.pi))
pi = 3.1416
> print(string.format("%02d/%02d/%04d", d, m, a))
03/06/2019
> tag, titulo = "h1", "un titulo"
> print(string.format("<%s>%s</%s>", tag, titulo, tag))
<h1>un titulo</h1>
>
Anuncios

En el primer caso la directiva %.4f indica que solo se mostraran cuatro decimales despues de la coma decimal, en el segundo caso %2d indica que deben ser dos numeros decimales, en el caso de que uno de los digitos pasados contenga uno solo este se encargara de completarlo con el cero, en el ultimo caso usamos el de cadena (%s) y este se completara automaticamente al valor asignado en la funcion.

Anuncios

En resumen, hoy hemos visto algunas de las funciones basicas de la libreria string, algunas que hemos visto anteriormente, otras con mas detalles, algunos usos practicos de las mismas, los argumentos que modifican a los mismos, 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.

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00