Informatica Grafica
C A P I T U L O 4 Estructuras de Datos

El tipo básico de datos en Tcl es el string, pero existen dos estructuras de más alto nivel, son las listas y los arrays

Listas Tcl

Las lista en Tcl están implementadas como strings. Es decir, una lista en Tcl es un string formado por varios strings separados por espacios en blanco. Se utilizan las llaves o las comillas para agrupar los elementos que forman la lista. Como curiosidad, las listas tienen la misma estructura que un comando en Tcl, son strings separados por espacios en blanco. Debido a esto, las listas pueden ser utilizadas para crear comando de Tcl.

Algunos ejemplos de listas serían:

Ejemplo 4-1
"rojo naranja amarillo verde azul morado"
{rojo naranja amarillo verde azul morado}
{{rojo1 rojo2 rojo3} naranja {amarillo1 amarillo2} verde azul morado}

Los elementos de una lista se reconocen por su índice. El índice del primer elemento de la lista es 0, y el del último, será la longitud de la lista menos uno.

Para la manipulación de las lista, existen una serie de comandos, que se citan a continuación:

Tabla 4-1. Comandos de Listas.

list arg1 arg2

Crea una lista con los argumentos.

lindex lista i

Devuelve el elemento i-ésimo de la lista.

llength lista

Devuelve la longitud de la lista.

lrange lista i j

Devuelve los elementos desde el i-esimo al j-esimo.

lappend listaVar arg arg

Añade al final de la lista los argumentos.

linsert lista indice arg arg

Inserta en la posición indice los argumentos. Devuelve una nueva lista.

lreplace lista i j arg arg

Reemplaza los elementos desde el i al j por los argumentos. Si no hay argumentos y i=j, borra este elemento. Devuelve una nueva lista.

lsearch modo lista valor

Devuelve el indice del elemento valor si está en la lista. el modo es el modo de búsqueda: -exact, -glob o -regexp. Por defecto es -glob. Devuelve -1 si no lo encuentra.

lsort switches lista

Ordena los elementos de la lista según el switch. Este puede ser -ascii, -integer, -real, -increasing, -decreasing. Devuelve una nueva lista.

concat arg arg

Junta múltiples argumentos en una lista.

join lista caracter

Une los elementos de una lista, separados por el carácter.

split string caracter

Corta un string en varios elementos y los devuelve en forma de lista. El caracter indica por donde debe cortarse.

Debido a la enorma importancia que estos comandos tienen en la programación en lenguaje Tcl, se va a estudiar por separado, cada uno de ellos de forma algo más pormenorizada.


Construcción de listas: list, lappend y concat

El comando list permite crea una lista y es posible asociarla a una variable:

Ejemplo 4-2

set var1 [list rojo verde azul]
De esta forma se habrá creado una lista de nombre var1, que tiene los elemntos rojo verde y azul.

El comando lappend agrega elementos al final de una lista ya existente o la crea con los elementos que se le pasan como argumentos.

Ejemplo 4-3
% set lista [list rojo verde azul]
rojo verde azul
% lappend lista rosa_mariposa rojo verde azul rosa_mariposa

Este comando debe ser utilizado con cuidado, ya que si por descuido, durante la ejecución del programa, se van acumulando en la lista numerosos elementos, el programa se relentiza enormemente. Tcl es muy lento en el tratamiento de las listas, y una lista de 50 o 60 elementos significa reducir de forma muy apreciable la velocidad. Por otro lado, una reducción considerable de la velocidad puede indicar una lista "descontrolada".

En comando concat es muy similar al comando lappend, con la diferencia de que concat une múltiples listas en una sola, mientras que lappend permite que un elemento de una lista, sea otra; es decir, permite listas dentro de listas. Esto se puede ver mejor con el siguiente ejemplo:

Ejemplo 4-4
% lappend lista1 1 {2 3} {4 5 6}
1 2 3 4 5 6
% concat 1 {2 3} {4 5 6}
1 2 3 4 5 6


Localización de elementos en listas: llength, lindex y lrange

El comando llength devuelve el número de elementos de una lista. Por ejemplo:

Ejemplo 4-5
% llength {a b {c d} "e f g" h}
5

El comando lindex, devuelve un elemento concreto de la lista. Toma el índice del elemento, empezando a contar desde el 0 como índice del primer elemento de la lista. La palabra clave end, es el índice del último elemento de la lista.

Ejemplo 4-6
lindex {1 2 3} 0
1
% set lista_colores {rojo verde azul morado amarillo}
rojo verde azul morado amarillo
% lindex $lista_colores end
amarillo

El comando lrange devuelve un rango de elementos de la lista. Toma como argumentos dos índices, y devolverá todos los elementos comprendidos entre esos dos índices, incluidos los correspondientes a los índices. En el siguiente ejemplo, se piden los elementos comprendidos entre el 2 y el último, ambos incluidos.

Ejemplo 4-7
% lrange {1 2 3 {4 5}} 2 end
3 {4 5}


Modificación de listas: linsert y lreplace

El comando linsert inserta un elemento en una lista con un índice determinado; es decir, en una posición determinada. Si el índice es 0 o menor, el elemento es insertado como el primero. Si el índice es igual o mayor que la longitud de la lista, este elemento será añadido al final de ella.

Este comando devuelve una nueva lista, por lo que si se desea que la lista sea modificada, deberá de escribirse algo así:

% set lista [linsert $ista 3 gris]

De esta forma si se modificará la lista. Pero si se hace así:

% linsert lista 3 gris

esto no modificará la lista.

Esto debe de hacerse con todos aquellos comandos que modifiquen listas (linsert, lreplace y lsort) si se desea que estos cambios sean permanentes en la lista

Ejemplo 4-8
%
linsert {rojo verde azul naranja} 1 gris
rojo gris verde azul naranja
% linsert {rojo verde azul naranja} 0 gris
gris rojo verde azul naranja
% linsert {rojo verde azul naranja} 4 gris
rojo verde azul naranja gris


El comando lreplace es usado para reemplazar los elementos comprendidos en un rango, por nuevos elementos. Por ejemplo:

Ejemplo 4-9
% lreplace {rojo verde azul naranja} 1 2 blanco gris
rojo blanco gris azul naranja
% lreplace {rojo verde azul naranja} 1 2 gris
rojo gris naranja

Como puede verse en el ejemplo, no es necesario que el número de elementos a sustituir sea igual al de sustitutos. Pueden ser sustituidos dos por tres o tres por dos, sin más problemas.

Al igual que en el caso del comando linsert, lreplace devuelve una nueva lista, por lo que será necesario salvar estos cambios si se desea que sean permanentes. Para ello:


% set lista {rojo verde azul naranja}
rojo verde azul naranja
% set lista [lreplace $lista 1 2 gris]
rojo gris naranja


Buscar en una lista: lsearch

El comando lsearch devuelve el índice del elemento de la lista buscado, o bien -1 si no está presente en la lista.

lsearch soporta varios tipos de búsqueda: -glob, -regexp, -exact. Por defecto es -glob

Ejemplo 4-10
% lsearch {esto es una lista} l*
3
set lista {rojo verde azul naranja}
% lsearch -exact $lista verde
1


Ordenando listas: lsort

El comando lsort permite ordenar listas de diferentes manera. Los tres tipos básicos de ordenación son especificados con -ascii, -integer o -real. La opción -increasing y la opción -decreasing indican el orden de la ordenación. La opción por defecto es -ascii e -increasing.

Ejemplo 4-11
set lista_colores {rojo verde azul naranja}
rojo verde azul naranja
lsort -ascii -decreasing $lista_colores
verde rojo naranja azul
lsort -ascii -increasing $lista_colores
azul naranja rojo verde

este comando devuelve una nueva lista, por lo que es necesario hacer:

set lista_colores [lsort -ascii -decreasing $lista_colores]

si se desea que los cambios sean permanentes (que es lo más normal).

Comandos split y join

El comando split, toma un string y lo convierte en una lista. Para ello corta por determinados lugares el string. Estos puntos de corte vienen determinados por el hecho de encontrar o no un determinado carácter, que se le pasará como parámetro.

Ejemplo 4-12
% set cadena nombre:apellidos:direccion:telefono
nombre:apellidos:direccion:telefono
% set lista [split $cadena :]
nombre apellidos direccion telefono
% lindex $lista 2
direccion

En el caso de este ejemplo el carácter que sirve para indicar el punto de corte es ":", pero puede ser cualquier otro. Este método permite extraer datos de un string.

El comando join, es el inverso del comando split. Toma una lista de valores y los formatea en un string, separando estos valores mediante un carácter que se le pasará como parámetro.

Ejemplo 4-13
% set cadena [join {nombre apellidos direccion telefono} :
nombre:apellidos:direccion :telefono

Arrays

La otra estructura de datos básica en Tcl es el array. Un array es una variable con un índice, que en el caso de tcl es un string. Este índice está delimitado entre paréntesis. El índice puede ser cualquier string, y puede ser el resultado de una operación de variables o de una sustitución.

Los arrays en tcl tienen una gran ventaja frente a los arrays de otros lenguajes como el C/C++. Mientras que en C/C++, el índice tiene que ser un número (un entero), en Tcl puede ser cualquier string. esto puede verse con un ejemplo.

Si Tcl sólo admitiese como índice enteros, la descripción de una ficha personal sería así:


% set ficha(1) $nombre
% set ficha(2) $apellido1
% set ficha(3) $apellido2

Pero al permitir que el índice sea cualquier cosa representada por un string, se podría poner así:


% set ficha(nombre) $nombre
% set ficha(apellido1) $apellido1
% set ficha(apellido2) $apellido2

Con lo que el código gana en legibilidad y claridad.. En el ejemplo anterior, el array sería "ficha", y tendría tres elementos.

Si en otros lenguajes existen arrays multidimensionales, en Tcl esto es indiferente. es posible escribir un array de la forma típica en que se declaran los arrays bidimensionales:


% set ficha(1,1) 23
% set ficha(1,2) 32

Y así sucesivamente.

Esto en Tcl no es ningún problema, ya que el intérprete entiende que el índice es un string de valor "1,1" o "1,2". Pero en algunos casos esto puede simplificar la programación y el clarificar el código. Así que se puede decir que Tcl admite arrays multidimensionales, aunque sea con una pequeña trampa.

Tabla 4-2. Comandos de Arrays.

array exists arr

Devuelve 1 si arr es una variable array.

array get arr

Devuelve una lista alternado el índice y el valor.

array names arr? patron?

Devuelve una lista con los índices que coinciden.

array set arr lista

Inicializa el array con la lista.

array size arr

Devuelve el número de índices.

array startsearch arr

Devuelve un id para buscar en arr.

array nextelement arr id

Devuelve el valor del siguiente elemento.

array anymore arr id

Devuelve 1 si quedan más elementos en la búsqueda.

array donesearch arr id

Termina la búsqueda en el elemento id.



Variables de entorno

Las variables de entorno de los procesos están disponibles en un array global (es decir, es accesible desde cualquier punto del programa), denominado env.El índice de este array es el nombre de cada variable de entorno, por ejemplo env(PATH)

Previous Page Next Page


© 1995-98, etsimo WWW team
Última modificación: 19 de Agosto de 1998 - 17:49:57