tcl
Wörterbücher
Suche…
Bemerkungen
Wörterbücher in Tcl sind Werte , die eine Zuordnung von beliebigen Werten zu anderen beliebigen Werten enthalten. Sie wurden in Tcl 8.5 eingeführt, obwohl es für Tcl 8.4 (die jetzt nicht mehr unterstützte) eingeschränkte Versionen gibt. Wörterbücher sind syntaktisch das gleiche wie Listen mit geraden Anzahlen von Elementen. Das erste Paar von Elementen ist der erste Schlüssel und Wert des Wörterbuchs, das zweite Paar ist das zweite Tupel.
Somit:
fox "quick brown" dogs "lazy"
ist ein gültiges Wörterbuch. Ein und derselbe Schlüssel kann mehrere Male sein, aber es ist genau so, als ob der Wert des letzteren im Wert des Vorgängers lag. das ist das gleiche Wörterbuch:
abcd {1 2 3} defg {2 3 4} abcd {3 4 5}
abcd {3 4 5} defg {2 3 4}
Whitespace ist ebenso wie bei Listen unwichtig.
Ein wichtiges Konzept bei Wörterbüchern ist die Iterationsreihenfolge. Wörterbücher versuchen, die Reihenfolge der Schlüsseleinfügung als Iterationsreihenfolge zu verwenden. Wenn Sie jedoch den Wert eines bereits vorhandenen Schlüssels aktualisieren, überschreiben Sie den Wert dieses Schlüssels. Neue Schlüssel gehen am Ende.
Referenzen: dict
Anhängen an ein verschachteltes Wörterbuch
Wenn wir dieses Wörterbuch haben:
set alpha {alice {items {}} bob {items {}} claudia {items {}} derek {items {}}}
Und Sie möchten "Forks" und "Peanut" zu Alices Artikeln hinzufügen, dieser Code funktioniert nicht:
dict lappend alpha alice items fork peanut
dict get $alpha alice
# => items {} items fork peanut
Da der Befehl nicht wissen kann, wo die Schlüssel-Token enden und die Werte an die Liste angehängt werden, ist der Befehl auf ein Schlüssel-Token beschränkt.
Der richtige Weg, um an das innere Wörterbuch anzuhängen, lautet:
dict with alpha alice {
lappend items fork peanut
}
dict get $alpha alice
# => items {fork peanut}
Dies funktioniert, weil der Befehl dict with Befehl enthält, verschachtelte Wörterbücher zu durchlaufen, und zwar so viele Ebenen wie die Anzahl der von uns bereitgestellten Schlüssel-Token. Anschließend werden Variablen mit denselben Namen wie die Schlüssel auf dieser Ebene erstellt (hier nur eine: items ). Die Variablen werden auf den Wert des entsprechenden Elements im Wörterbuch initialisiert. Wenn wir den Wert ändern, wird dieser geänderte Wert verwendet, um den Wert des Wörterbuchelements zu aktualisieren, wenn das Skript beendet wird.
(Beachten Sie, dass die Variablen nach Beendigung des Befehls weiterhin vorhanden sind.)
Grundlegende Verwendung eines Wörterbuchs
Wörterbuch erstellen:
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
Wörterbuchschlüssel können verschachtelt sein.
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"
}
}
Der Befehl dict get kann einen Fehler auslösen
set alpha {a 1 b 2 c 3}
dict get $alpha b
# => 2
dict get $alpha d
# (ERROR) key "d" not known in dictionary
Wenn dict get verwendet wird, um den Wert eines fehlenden Schlüssels abzurufen, wird ein Fehler ausgegeben. Um den Fehler zu vermeiden, verwenden Sie dict exists :
if {[dict exists $alpha $key]} {
set result [dict get $alpha $key]
} else {
# code to deal with missing key
}
Wie Sie mit einem fehlenden Schlüssel umgehen, hängt natürlich von der Situation ab: Eine einfache Möglichkeit besteht darin, das result auf einen Standardwert "leer" festzulegen.
Wenn der Code niemals versucht, andere Schlüssel aus dem Wörterbuch abzurufen, dict get natürlich nicht fehl. Für beliebige Schlüssel ist dict get jedoch eine Operation, die überwacht werden muss. Vorzugsweise ist ein Test mit dict exists , obwohl auch das Auslösen von Ausnahmen funktioniert.
Iteration über ein Wörterbuch
Sie können den Inhalt eines Wörterbuchs mit dict for iterieren, ähnlich wie bei foreach :
set theDict {abcd {ab cd} bcde {ef gh} cdef {ij kl}}
dict for {theKey theValue} $theDict {
puts "$theKey -> $theValue"
}
Dies erzeugt diese Ausgabe:
abcd -> ab cd bcde -> ef gh cdef -> ij kl
Sie erhalten dieselbe Ausgabe, wenn Sie die dict keys mit den Diktasten auflisten und darüber iterieren:
foreach theKey [dict keys $theDict] {
set theValue [dict get $theDict $theKey]
puts "$theKey -> $theValue"
}
Aber das dict for ist effizienter.