====== Variables en TCL ======
En Tcl, les variables sont non typées, et peuvent être, suivant le cas, considérées comme chaînes de caractères (le cas le plus large), listes (ensemble ordonné d'éléments non typés qui peuvent aussi être eux mêmes des listes), entiers ou flottants. Elles peuvent aussi être des tableaux à une ou plusieurs dimensions. Une même variable peut être considérée de types différents suivant l'opération que l'on fait sur elle.
Voici 4 types de variables expliquées :
===== Les variables simples =====
L'accès à une variable `nom_variable` se fait par `$nom_variable`. L'affectation se fait par la commande [[:tcl:lset]].
Par exemple :
set a 12 ; # La variable a reçoit "12"
puts a ; # Affichage du caractère "a"
résultat : a
puts $a ; # Affichage du contenu de la variable a
résultat : 12
set a b ; # La variable a reçoit la lettre "b"
set b ilétaitunebergère ; # La variable b reçoit la chaîne "ilétaitunebergère"
puts $a ; # Affichage de la valeur de a
Résultat : b
puts $b ; # Affichage de la valeur de b
Résultat : ilétaitunebergère
puts [subst $$a] ; # Affichage de la valeur de la variable contenue dans la variable a,
Résultat : ilétaitunebergère((La fonction [[:tcl:subst]] force l'évaluation le plus loin possible des variables)) ((L'emploi des crochets sera expliqué plus loin))
Il existe des chaînes de caractères pouvant contenir des espaces:
set toto il était une bergère ; # utilisation de la fonction set avec trop d'arguments
#Résultat : wrong # args: should be "set varName ?newValue?"
set toto "il était une bergère" ; # utilisation correcte de set
set toto {il était une bergère} ; # autre utilisation correcte de set
set a bergère
set toto "il était une $a"
puts $toto
#Résultat : il était une bergère
set toto {il était une $a}
puts $toto
#Résultat : il était une $a
Les guillemets permettent l'utilisation de caractères blancs (espaces) dans une chaîne, les accolades aussi, mais elle interdisent l'évaluation des variables éventuelles contenues dans la chaîne.
Il est aussi possible d'utiliser des espaces dans une chaîne de caractères en les faisant précéder d'un anti-slash. Celui-ci permet de considérer le caractère qui le suit comme un caractère normal.
set toto il\ était\ une\ $a
puts $toto
#Résultat : il était une bergère
Ainsi si une chaîne de caractères doit contenir des guillemets ou des accolades :
set toto {il\ était\"\ une\nbergère # \n } ; # force un retour chariot
puts $toto
# Résultat : il était" une
bergère
Remarque: la concaténation de chaînes peut se faire de manière automatique
set Aut "un aut"
set Re re
set toto "un train peut en cacher $Aut$Re"
#Résultat : un train peut en cacher un autre
===== Les listes =====
Tcl permet de tout considérer comme une liste, par exemple:
set toto "il était une bergère"
llength $toto
#fonction retournant le nombre d'éléments de la liste en argument
#Résultat : 4
Il est possible de construire explicitement des listes par l'utilisation du constructeur [[:tcl:list]] ou par l'utilisation d'accolades:
set toto {il {était une bergère}} ; # liste contenant deux éléments
puts $toto
#Résultat : il {était une bergère}
llength $toto ; # nombre d'éléments de la liste
#Résultat : 2
llength [lindex $toto 1] ; # nombre d'éléments du deuxième élément de la liste: celles-ci sont indexées à partir de 0
#Résultat : 3
set toto [list il [list était une bergère]] ; # donne le même résultat qu'en utilisant les accolades. Cependant, \ permet l'utilisation de variables dans la fabrication de la liste, ce que les accolades empêchent.
La fonction la plus intéressante pour le parcours de liste est [[:tcl:foreach]], qui permet d'effectuer un ensemble de commandes sur (ou à partir de) l'ensemble des éléments d'une liste
set maliste "Il était une bergère"
foreach mot $maliste {
puts $mot
}
#Résultat :
Il
était
une
bergère
La propriété intéressante de foreach est qu'elle permet de traiter les éléments de l'ensemble par couple, triplet, etc...
foreach {motimpair motpair} $maliste {
puts $motpair ; # seul un mot sur deux est affiché
}
était
bergère
===== Les nombres entiers et flottants =====
Comme Tcl considère que tout est chaîne de caractères, il est nécessaire de lui spécifier qu'une opération arithmétique est désirée:
set a 23+12
#Résultat : 23+12
set a [expr 23+12] ; # utilisation de la fonction expr pour des calculs arithmétiques
Résultat : 35
La différence entre entiers et flottants se fait de manière implicite suivant le type des opérandes. Le fait d'ajouter une décimale indique à l'interpréteur que le nombre est un flottant. Les deux exemples ci-dessous sont très explicite :
expr 23/3 ; # calcul entier car les deux arguments sont des entiers
#Résultat : 7
expr 23.0/3 ; # un des arguments est un réel => calcul flottant
#Résultat : 7.66667
la virgule décimale est un point car elle utilise la notation Anglaise. Si vous effectuez un calcul avec une virgule, l'interpréteur vous renverra une erreur.
===== Les tableaux =====
Les tableaux sont des variables possédant des entrées:
set tableau(oncle) Tom
puts $tableau(oncle)
#Résultat: Tom
set i oncle
puts $tableau($i)
#l'entrée oncle du tableau reçoit la chaîne "Tom" référence au contenu d'une variable de type tableau encore une référence, mais cette fois ci par une variable
On peut aussi créer des tableaux à plusieurs dimensions, dans ce cas les noms d’entrées sont séparés par des virgules :
set tab2(case,enpaille) oncle
puts $tableau($tab2(case,enpaille))
# l'entrée référencée par case et enpaille reçoit "oncle" affichage de l'entrée oncle de tableau Tom
une variable de type tableau ne peut pas être créée dans une variable autre et vice-versa:
set toto 12 ; # toto est donc connu par l'interpréteur comme une variable chaîne
set toto(a) 10 ; # assignation incorrecte
#Résultat : can't set "toto(a)": variable isn't array
unset toto ; # le contenu de la variable est libéré, de plus la variable toto est "oubliée"
set toto(a) 10 ; # assignation maintenant correcte car toto est une nouvelle variable
===== Source =====
Intégralement repris depuis [[https://tcltk.fr/?les-variables|tcltk.fr]] avec l'aimable autorisation de **Fabien**
{{tag>tcl}}
===== Voir aussi =====
[[:tcl:dict]], [[:tcl:list]], [[:tcl:set]], [[:tcl:unset]]