====== switch ======
Évalue un parmi plusieurs scripts, dépendant d'une valeur donnée
===== Syntaxe =====
switch ?options? string pattern body ?pattern body ...?
switch ?options? string {pattern body ?pattern body ...?}
===== Description =====
La commande **switch** compare son argument //string// à chacun des arguments //pattern// dans l'ordre. Dès qu'elle trouve un //pattern// qui correspond à //string// elle évalue les argument //body// suivants en les transmettant récursivement à l'interpréteur Tcl et retourne le résultat de cette évaluation . Si le dernier argument //pattern// est **default** alors il correspond à tout. Si aucun argument //pattern// correspond à //string// et qu'aucun défaut n'est donné, alors **switch** retourne une chaîne vide.
Si les arguments initiaux de switch commencent avec - alors ils sont traités comme des options Les options suivantes sont couramment supportées:
* **-exact** Utilise la correspondance exacte pendant la comparaison de string à un modèle C'est le défaut.
* **-glob** Pendant la comparaison de string aux modèles, utilise une correspondance glob-style (ex. la même qu'implémentée par la commande [[:tcl:string#match|string match]]).
* **-regexp** Pendant la comparaison de string aux modèles, utilise la correspondance expression rationnelle (comme décrit dans la page de [[:faq:re_syntax]]).
* **--** Marque la fin des options L'argument suivant sera traité comme string même s'il commence avec un -.
Deux syntaxes sont fournie pour les arguments //pattern// et //body//.
- La première utilise un argument séparé pour chacun des modèles et commandes; cette forme est pratique si des substitutions sont désirées sur un modèle ou une commande.
- La seconde forme place tous les modèles et les commandes ensemble dans un seul argument; l'argument doit avoir une structure de liste correcte, avec les éléments de la liste étant les modèles et les commandes.
La seconde forme facilite la construction de commandes **switch** multi-ligne, puisque les accolades entourant la liste rendent inutile l'inclusion d'un antislash à la fin de chaque ligne. Comme les arguments //pattern// sont dans accolades dans la seconde forme, aucunes substitutions de commande ou de variable ne sont effectuée sur ceux-ci; cela rend le comportement de la seconde forme différent de la première forme dans certains cas.
Si un //body// est spécifié comme "-" cela signifie que le //body// du modèle suivant doit être aussi utilisé comme le corps pour ce modèle (si le modèle suivant a aussi un corps de "-" alors le corps qui est utilisé après, et ainsi de suite). Cette fonctionnalité rend possible de partager une seul body entre plusieurs modèles.
Attention à l'emplacement des commentaires dans les commandes switch Ils devront être placés seulement dans l'exécution du corps d'un des modèles, et pas mélangés avec les modèles.
===== Exemples =====
switch abc a - b {format 1} abc {format 2} default {format 3}
# 2
switch -regexp aaab {
^a.*b$ -
b {format 1}
library {format 2}
default {format 3}
}
# 1
switch xyz {
a -
b {
# Placement Correct du Commentaire
format 1
}
library {
format 2
}
default {
format 3
}
}
# 3
===== Voir aussi =====
{{tag>tcl}}