foreach

 

foreach - Itère sur tout les éléments d'une ou plusieurs listes

SYNTAXE

 foreach varname list body
 foreach varlist1 list1 ?varlist2 list2 ...? body

DESCRIPTION

La commande foreach implémente une boucle où la ou les variable(s) de boucle tirent leur valeurs d'une ou de plusieurs listes. Dans le cas le plus simple il y a une variable de boucle, varname, et une liste, list, qui est une liste de valeurs a assigner à varname. L'argument body est un script Tcl. Pour chaque élément de list (dans l'ordre du premier au dernier), foreach assigne le contenu de l'élément à varname comme si la commande lindex avait été utilisée pour extraire l'élément, ensuite elle appelle l'interpréteur Tcl pour exécuter body.

Dans le cas général il peut y avoir plus d'une liste de valeurs (ex., list1 et list2), et chaque liste de valeurs peut être associée à une liste de variables de boucle (ex., varlist1 et varlist2). Durant chaque itération de la boucle, aux variables de chaque varlist sont assignés les valeurs consécutive de la correspondante list. Les valeurs de chaque list sont utilisées dans l'ordre du premier au dernier, et chaque valeur est utilisée une seule fois. Le nombre total d'itérations est suffisant pour utiliser toutes les valeurs à partir de toutes les listes de valeurs. Si une liste de valeurs ne contient pas assez d'éléments pour chacune de ses variables de boucle à chaque itération, des valeurs vides sont utilisées pour les éléments manquants.

Les instructions break et continue peuvent être appelées dans body, avec le même effet que dans la commandefor. Foreach retourne une chaîne vide.

EXEMPLES

La boucle suivante utilise i et j comme variables de boucle pour itérer sur des paires d'éléments d'une simple liste.

 set x {}
 foreach {i j} {a b c d e f} {
     lappend x $j $i
 }
 # La valeur de x est "b a d c f e"
 # Il y a 3 itérations de boucle.

La boucle suivante utilise i et j pour itérer sur deux listes en parallèle.

 set x {}
 foreach i {a b c} j {d e f g} {
     lappend x $i $j
 }
 # La valeur de x est "a d b e c f {} g"
 # Il y a 4 itérations de boucle.

Les deux formes sont combinées dans le suivant exemple.

 set x {}
 foreach i {a b c} {j k} {d e f g} {
     lappend x $i $j $k
 }
 # La valeur de x est "a d e b f g c {} {}"
 # Il y a 3 itérations de boucle.

RS: On peut aussi utiliser foreach pour décomposer tout ou partie d'une liste en variables distinctes:

 foreach {premier second troisième} $liste break

ou échanger les valeurs de deux variables:

 foreach {a b} [list $b $a] break

FP: À partir de la version 8.5, lassign permet de se débarrasser la construction baroque décrite par RS :

 lassign $list premier second troisième

Catégorie Manuel Tcl/Tk