tcl
Dictionnaires
Recherche…
Remarques
Les dictionnaires dans Tcl sont des valeurs qui contiennent un mappage de valeurs arbitraires vers d'autres valeurs arbitraires. Ils ont été introduits dans Tcl 8.5, bien qu'il y ait des versions limitées pour Tcl 8.4. Les dictionnaires sont syntaxiquement les mêmes que les listes avec des nombres pairs d'éléments; la première paire d'éléments est la première clé et la valeur du dictionnaire, la deuxième paire est le deuxième tuple.
Ainsi:
fox "quick brown" dogs "lazy"
est un dictionnaire valide. La même clé peut être plusieurs fois, mais c'est exactement comme si la valeur de ce dernier était dans la valeur précédente; ce sont le même dictionnaire:
abcd {1 2 3} defg {2 3 4} abcd {3 4 5}
abcd {3 4 5} defg {2 3 4}
Les espaces sont sans importance, tout comme les listes.
Un ordre important avec les dictionnaires est l'ordre d'itération; Les dictionnaires tentent d'utiliser l'ordre d'insertion de clé comme ordre d'itération, mais lorsque vous mettez à jour la valeur d'une clé existante, vous écrasez la valeur de cette clé. Les nouvelles clés vont à la fin.
Références: dict
Ajout de liste à un dictionnaire imbriqué
Si nous avons ce dictionnaire:
set alpha {alice {items {}} bob {items {}} claudia {items {}} derek {items {}}}
Et que vous voulez ajouter "fork" et "peanut" aux éléments d'Alice, ce code ne fonctionnera pas:
dict lappend alpha alice items fork peanut
dict get $alpha alice
# => items {} items fork peanut
Comme il est impossible pour la commande de savoir où les clés de clés se terminent et les valeurs à ajouter à la liste, la commande est limitée à un seul jeton de clé.
La manière correcte d’ajouter au dictionnaire interne est la suivante:
dict with alpha alice {
lappend items fork peanut
}
dict get $alpha alice
# => items {fork peanut}
Cela fonctionne parce que la commande dict with permet de traverser des dictionnaires imbriqués, autant de niveaux que le nombre de clés que nous fournissons. Il crée ensuite des variables portant les mêmes noms que les clés de ce niveau (une seule ici: items ). Les variables sont initialisées à la valeur de l'élément correspondant dans le dictionnaire. Si nous modifions la valeur, cette valeur modifiée est utilisée pour mettre à jour la valeur de l'élément du dictionnaire à la fin du script.
(Notez que les variables continuent à exister lorsque la commande est terminée.)
Utilisation de base d'un dictionnaire
Créer un dictionnaire:
set mydict [dict create a 1 b 2 c 3 d 4]
dict get $mydict b ; # returns 2
set key c
set myval [dict get $mydict $key]
puts $myval
# remove a value
dict unset mydict b
# set a new value
dict set mydict e 5
Les clés de dictionnaire peuvent être imbriquées.
dict set mycars mustang color green
dict set mycars mustang horsepower 500
dict set mycars prius-c color orange
dict set mycars prius-c horsepower 99
set car [dict get $mycars mustang]
# $car is: color green horsepower 500
dict for {car cardetails} $mycars {
puts $car
dict for {key value} $cardetails {
puts " $key: $value"
}
}
La commande dict get peut générer une erreur
set alpha {a 1 b 2 c 3}
dict get $alpha b
# => 2
dict get $alpha d
# (ERROR) key "d" not known in dictionary
Si dict get est utilisé pour récupérer la valeur d'une clé manquante, une erreur est générée. Pour éviter l'erreur, utilisez dict exists :
if {[dict exists $alpha $key]} {
set result [dict get $alpha $key]
} else {
# code to deal with missing key
}
Comment gérer une clé manquante dépend bien sûr de la situation: une manière simple consiste à définir le result sur une valeur par défaut "vide".
Si le code ne tente jamais de récupérer d'autres clés qui se trouvent dans le dictionnaire, il est dict get n'échouera pas. Mais pour des clés arbitraires, dict get est une opération qui doit être surveillée. De préférence, en testant avec dict exists , bien que la capture d’exceptions fonctionnera aussi.
Itérer sur un dictionnaire
Vous pouvez parcourir le contenu d'un dictionnaire avec dict for , ce qui est similaire à foreach :
set theDict {abcd {ab cd} bcde {ef gh} cdef {ij kl}}
dict for {theKey theValue} $theDict {
puts "$theKey -> $theValue"
}
Cela produit cette sortie:
abcd -> ab cd bcde -> ef gh cdef -> ij kl
Vous obtiendrez la même sortie en utilisant les dict keys pour lister les clés et les itérer par dessus:
foreach theKey [dict keys $theDict] {
set theValue [dict get $theDict $theKey]
puts "$theKey -> $theValue"
}
Mais le dict for est plus efficace.