Tcl8.5 - Das Dictionary (Teil 1)
9. Mai 2009 | 11:32:29
Seit der Version 8.5 stellt Tcl einen neuen Datentyp, Dictionary genannt, zur Verfügung. Dieser Datentyp entspricht einem assoziativen Array (Schlüssel-Wert Paare) und ermöglicht den Aufbau hierarchischer Datenstrukturen (baumartiger Strukturen). Weiterhin ist es möglich, das komplette Dictionary (oder ein Sub-Dictionary) einem Funktionsaufruf als Parameter zu übergeben. Was ja mit "normalen" Tcl-Arrays nicht bzw. nicht ohne weiteres möglich war. Das Dictionary stellt zahlreiche Features bereit, von denen wir uns nachfolgend einige näher ansehen werden.
Wir haben nun das Dictionary person erzeugt und schon mit einigen Daten gefüllt. Eine andere Möglichkeit wäre:
oder so:
oder auch so:
Weitere Arten sind denkbar, aber die hier gezeigten sollten uns vorerst reichen.
Unsere Variable person kann man sich dabei als Wurzel (der Datenstruktur) vorstellen. Lassen wir uns nun mal die jeweiligen Schlüssel und Werte der Knoten, die direkt unterhalb der Wurzel liegen, anzeigen.
Lesen wir nun den Inhalt des (Sub-)Dictionarys des Knotens mit den Schlüssel 0 aus:
Auch hier gibt es mehrere mögliche Wege, um ans Ziel zu kommen. Nun interessieren wir uns für die Schlüssel sowie deren Werte, die das eben ausgelesene Dictionary enthält:
[dict keys param] sowie [dict values param] erwarten als Parameter param wieder ein Dictionary
(z.B. [dict keys [dict get $person 0]]).
Übrigens kann man auch eine sehr vereinfachte Filterung (entspricht mehr einem Datei-Globbing) der Schlüssel/Werte vornehmen. Lassen wir uns z.B. nur die Schlüssel ausgeben, die auf "name" enden:
Als Ergebnis erhalten wir die Schlüssel "vorname" sowie "nachname".
Möchte man sich gezielt über den Wert eines Schlüssels informieren, so tut man dies z.B. wie folgt:
Falsch wäre z.B. folgender Ansatz:
Man erhält eine Fehlermeldung, da dict values param als Parameter ja - wie bereits erwähnt - wieder ein Dictionary erwartet. Gleiches trifft auch für dict keys param zu.
Ein einfaches Dictionary anlegen
Ein Dictionary läßt sich auf unterschliedliche Art erstellen.dict set person 0 vorname Matthias
dict set person 0 nachname Sonnenkalb
dict set person 0 wohnort {"Halle Saale"}
dict set person 0 plz 06110
dict set person 1 vorname Klaus
dict set person 1 nachname Mustermann
dict set person 1 wohnort Musterhausen
dict set person 1 plz 16116Wir haben nun das Dictionary person erzeugt und schon mit einigen Daten gefüllt. Eine andere Möglichkeit wäre:
set person [dict create 0 vorname Matthias \
nachname Sonnenkalb \
wohnort {"Halle Saale"} \
plz 06110 \
1 vorname Klaus \
nachname Mustermann \
wohnort Musterhausen \
plz 16116]oder so:
set values0 [list vorname Matthias nachname Sonnenkalb ort {"Halle Saale"}]
set values1 [list vorname Klaus nachname Mustermann ort Musterhausen]
set person [dict create 0 {} 1 {}]
dict set person 0 $values0
dict set person 1 $values1oder auch so:
set values0 [list vorname Matthias nachname Sonnenkalb ort {"Halle Saale"}]
set values1 [list vorname Klaus nachname Mustermann ort Musterhausen]
set person [dict create 0 {} 1 {}]
dict update person 0 val0 1 val1 { set val0 $values0; set val1 $values1 }Weitere Arten sind denkbar, aber die hier gezeigten sollten uns vorerst reichen.
Schlüssel und Werte
Einen vollständigen Überblick über den Inhalt des gesamten Dictionarys person zeigen die beiden folgenden Methoden:puts $person
puts [dict get $person]Unsere Variable person kann man sich dabei als Wurzel (der Datenstruktur) vorstellen. Lassen wir uns nun mal die jeweiligen Schlüssel und Werte der Knoten, die direkt unterhalb der Wurzel liegen, anzeigen.
puts "Schlüssel: [dict keys $person]
[dict values $person]
Lesen wir nun den Inhalt des (Sub-)Dictionarys des Knotens mit den Schlüssel 0 aus:
set person_0 [dict get $person 0]
# oder etwas umständlicher
#
#set person_0 [lindex [dict get $person] 1]
# oder noch etwas umständlicher
#
#set person_0 [dict get [dict get $person] 0]
# anzeigen des Ergebnisses
puts $person_0
Auch hier gibt es mehrere mögliche Wege, um ans Ziel zu kommen. Nun interessieren wir uns für die Schlüssel sowie deren Werte, die das eben ausgelesene Dictionary enthält:
set schluessel [dict keys $person_0]
set werte [dict values [dict get $person_0][dict keys param] sowie [dict values param] erwarten als Parameter param wieder ein Dictionary
(z.B. [dict keys [dict get $person 0]]).
Übrigens kann man auch eine sehr vereinfachte Filterung (entspricht mehr einem Datei-Globbing) der Schlüssel/Werte vornehmen. Lassen wir uns z.B. nur die Schlüssel ausgeben, die auf "name" enden:
puts [dict keys $person_0 {*name}]Als Ergebnis erhalten wir die Schlüssel "vorname" sowie "nachname".
Möchte man sich gezielt über den Wert eines Schlüssels informieren, so tut man dies z.B. wie folgt:
# Vorname der Person 0 (Wert des Schlüssels 'vorname')
puts [dict get $person 0 vorname]
# Wohnort der Person 1 (Wert des Schlüssels 'wohnort')
puts [dict get $person 1 vorname]Falsch wäre z.B. folgender Ansatz:
# Wohnort der Person 0 abfragen
puts [dict values [dict get $person 0 vorname]]Man erhält eine Fehlermeldung, da dict values param als Parameter ja - wie bereits erwähnt - wieder ein Dictionary erwartet. Gleiches trifft auch für dict keys param zu.

