#!/usr/bin/tclsh
array set a {}
for {set i 0} {$i < 10} {incr i} {
set a($i) [expr {$i + 10}]
}
set i 0
while {$i < 10} {
puts "$i -> $a($i)"
incr i
}
puts "----------------------------"
while { $i > 0} {
incr i -1
puts -nonewline "$i -> $a($i)"
if {$i > 4} {
puts ""
continue
}
puts " **"
if {$i == 1} {break}
}
puts "----------------------------"
foreach {k v} [lsort [array get a]] {
puts -nonewline "$k "
}
foreach k [lsort [array names a]] {
puts -nonewline "$a($k) "
}
puts ""
TCL también nos ofrece una modesta selección de elementos para
construir nuestros bucles, permitiéndonos construir bucles
for
y while
y controlar su ejecución con
continue
y break
de la misma forma que en el
resto de lenguajes que ya hemos visto.
Los bucles for
, como es habitual, ofrecen una forma
compacta de los bucles while
, permitiéndonos inicializar,
indicar la condición de finalización del bucle y la forma de avanzar la
iteración en una sola línea:
for {set i 0} {$i < 10} {incr i} ...
Como podéis ver para incrementar la variable podemos utilizar
incr
.
SABIAS QUE
incr
es una instrucción TCL que nos permite incrementar una variable, cuando la utilizamos con un solo parámetro, ese parámetro debe ser la variable, y esta se incrementará en 1. Podemosm usar un segundo parámetro con el que indicar la cantidad en la que queremos incrementar la variable. Finalmente, podemos indicar el incremento con otra variable, por ejemplo:incr foo $bar
Incrementará la variable
foo
el valor contenido en la variablebar
.
incr
es muy útil puesto que de lo contrario tendríamos que escribir algo como esto:
incr foo # Es equivalente a set foo [expr {$foo + 1}]
TCL también nos permite iterar sobre arrays de forma sencilla
utilizando la palabra clave foreach
, la cual puede iterar
sobre las claves del array o sobre las claves y sus valores, dependiendo
de la operación que utilicemos para acceder al array: get
o
names
.
foreach
permite iterar listas. De hecho nos permite
iterar más de una lista a la vez y extraer más de una valor en cada
iteración. Por ejemplo:
for each i {a b c} {j k} {m n o p q r} {
puts "$i -> $j, $j"
}
Mostrará la siguiente salida:
a - m, n
b - o, p
c - q, r
La variable i
se utiliza para iterare la primera lista
{a b c}
, y las variables j
y k
se
utilizan para iterar la segunda lista {m n o p q r}
. Como
podéis ver, en la segunda lista, las variables j
y
k
van tomando valores consecutivos de la lista. Podríamos
añadir más listas o más variables en cada lista. Como podéis ver
foreach
es una instrucción muy potente.
SABIAS QUE
TCL trata los arrays internamente como tablas hash, por esa razón hablamos de claves y valores. Esta es también la razón por la que los valores se devuelven en un orden aleatorio cuando recorremos el array. En el ejemplo podéis ver como usamos
lsort
para ordenar los valores por clave que sería equivalente a mostrar el array usando los índices de cada elemento.
Podemos crear bucles infinitos en TCL usando cualquiera de las siguientes formas:
while (1) {
# Bucle
}
for {} {1} {} {
# Bucle
}
Al igual que sucede con Bash, TCL trabaja sobre cadenas de caracteres
y es por ello que no podemos realizar operaciones aritméticas
directamente sobre nuestras variables. Estas operaciones las podemos
realizar con el comando expr
.
Resumen
- TCL ofrece bucles
for
,while
yforeach
- TCL ofrece las palabras claves
break
ycontinue
para controlar el flujo de os bucles.
■