Sök…
Anmärkningar
Ordböcker i Tcl är värden som innehåller en kartläggning från godtyckliga värden till andra godtyckliga värden. De introducerades i Tcl 8.5, även om det finns begränsade versioner för (den nu inte stöds) Tcl 8.4. Ordböcker är syntaktiskt samma som listor med jämnt antal element; det första elementet är den första nyckeln och värdet i ordboken, det andra paret är den andra tupeln.
Således:
fox "quick brown" dogs "lazy"
är en giltig ordlista. Samma nyckel kan vara flera gånger, men det är exakt som om det sistnämnda värdet var i det tidigare värdet; dessa är samma ordbok:
abcd {1 2 3} defg {2 3 4} abcd {3 4 5}
abcd {3 4 5} defg {2 3 4}
Whitespace är obetydlig, precis som med listor.
Ett viktigt begrepp med ordböcker är iterationsordning; ordböcker försöker använda nyckelinsättningsordningen som deras iterationsordning, men när du uppdaterar värdet för en nyckel som redan finns, skriver du över nyckelns värde. Nya nycklar fortsätter.
Referenser: dict
Lista som lägger till en kapslad ordbok
Om vi har den här ordlistan:
set alpha {alice {items {}} bob {items {}} claudia {items {}} derek {items {}}}
Och vill lägga till "gaffel" och "jordnötter" till Alice's artiklar, den här koden fungerar inte:
dict lappend alpha alice items fork peanut
dict get $alpha alice
# => items {} items fork peanut
Eftersom det skulle vara omöjligt för kommandot att veta var nyckeltokens slutar och värdena som ska bifogas listlista, är kommandot begränsat till ett nyckeltoken.
Det rätta sättet att lägga till den inre ordboken är detta:
dict with alpha alice {
lappend items fork peanut
}
dict get $alpha alice
# => items {fork peanut}
Detta fungerar eftersom dict with kommandot låter oss korsa kapslade ordböcker, lika många nivåer som antalet nyckeltokens vi tillhandahåller. Den skapar sedan variabler med samma namn som tangenterna på den nivån (endast en här: items ). Variablerna initialiseras till värdet på motsvarande objekt i ordboken. Om vi ändrar värdet används det ändrade värdet för att uppdatera värdet på ordboken när skriptet slutar.
(Observera att variablerna fortsätter att existera när kommandot har avslutats.)
Grundläggande användning av en ordlista
Skapa en ordlista:
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
Ordboksknappar kan kapslas.
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"
}
}
Kommandot dict get kan ge upp ett fel
set alpha {a 1 b 2 c 3}
dict get $alpha b
# => 2
dict get $alpha d
# (ERROR) key "d" not known in dictionary
Om dict get används för att hämta värdet på en saknad nyckel uppstår ett fel. För att förhindra felet använder du dict exists :
if {[dict exists $alpha $key]} {
set result [dict get $alpha $key]
} else {
# code to deal with missing key
}
Hur man hanterar en saknad nyckel beror givetvis på situationen: ett enkelt sätt är att ställa in result till ett standard "tomt" värde.
Om koden aldrig försöker hämta andra nycklar som finns i ordboken, kommer naturligtvis inte dict get att misslyckas. Men för godtyckliga nycklar är dict get en operation som måste skyddas. Företrädesvis genom att testa med dict exists , även om undantagsfångst fungerar också.
Iterating över en ordbok
Du kan upprepa innehållet i en ordlista med dict for , vilket liknar foreach :
set theDict {abcd {ab cd} bcde {ef gh} cdef {ij kl}}
dict for {theKey theValue} $theDict {
puts "$theKey -> $theValue"
}
Detta ger denna utgång:
abcd -> ab cd bcde -> ef gh cdef -> ij kl
Du skulle få samma utgång genom att använda dict keys att lista tangenterna och upprepa det där:
foreach theKey [dict keys $theDict] {
set theValue [dict get $theDict $theKey]
puts "$theKey -> $theValue"
}
Men det dict for mer effektivt.