Entrada de Datos en TCL
#!/usr/bin/tclsh
puts -nonewline "Introduce dos numeros separados por un espacio ? "
flush stdout
scan [gets stdin] "%d %d" n t
puts "Has introducido $n y $t"
puts "Introduce 10 numeros separados por espacios?"
set a [ split [gets stdin] " "]
puts "Has introducido : "
foreach i $a {
puts -nonewline "$i "
}
flush stdoutTCL nos ofrece una función similar a la función scanf de
C para leer valores desde del usuario. En este casi, la función
scan de TCL sería realmente equivalente a la función C
sscanf puesto que se aplica sobre cadenas de
caracteres.
scanretorna el número de valores que ha conseguido convertir, lo cual se puede utilizar para determinar si la entrada del usuario es correcta. Una particularidad descanes que si no puede convertir un determinado valor, la variable designada para almacenar ese valor no se modifica, es decir, mantiene el valor asignado previamente.set n [[gets stdin] “%d %d” n t]
Esta línea almacenará en
ncuantos valores ha sido capaz de leer.
TCL nos ofrece así mismo una función split, como la que
hemos visto en otros lenguajes, que nos permite trocear una cadena de
caracteres en una matriz de una sola tacada. Como sucede con Perl o
Bash, en TCL todas las variables son cadenas de caracteres así que no es
necesario ningún tipo de conversion.
En el caso de que necesitemos comprobar que los valores introducidos
son numéricos, TCL ofrece el comando string is. La forma de
usarlo es muy sencilla:
if {[string is integer -strict $valor]} {
puts "Valor entero"
} else {
puts "Valor no entero"
}El flag -strict utilizado en el programa anterior hace
que una cadena vacía se interprete como un 0. Si no lo usamos, el
resultado sería 1.
El primer parámetro del comando
string isse conoce como clase y nos indica que tipo de datos queremos comprobar, lo que incluye una amplia gama de opciones.integerydoubleson las opciones más obvias, pero existen otras comoentier(entero arbitrariamente largo),booleanoalnumpara caracteres alfanuméricos (letras y números).
En caso de que queramos ofrecer mensajes de error más detallados,
string is ofrece un segundo flag llamado
-failindex el cual nos va a permitir recuperar el índice
dentro de la cadena en el que se ha producido el error de conversión. El
siguiente código ilustra su uso.
set s "123abc"
if {![string is integer -strict -failindex indx $s]} {
puts "No un entero"
puts "Error en indice $indx"
}El programa anterior nos indicará que la conversión a entero de la
cadena de entrada 123bc ha fallado en el índice 3 (la letra
a).
Resumen
- TCL trabaja sobre cadenas así que la única forma de leer datos por el usuario es como una cadena de texto
- El comando
scannos permite extraer valores numéricos muy fácilmente de una cadena de caracteres. - El comando
string isnos permite validar cadenas de caracteres contra tipos de datos como enteros o números decimales entre otros.
■
