tcl
Woordenboeken
Zoeken…
Opmerkingen
Woordenboeken in Tcl zijn waarden die een afbeelding bevatten van willekeurige waarden naar andere willekeurige waarden. Ze werden geïntroduceerd in Tcl 8.5, hoewel er beperkte versies zijn voor (de nu niet-ondersteunde) Tcl 8.4. Woordenboeken zijn syntactisch hetzelfde als lijsten met een even aantal elementen; het eerste paar elementen is de eerste sleutel en waarde van het woordenboek, het tweede paar is de tweede tupel.
Dus:
fox "quick brown" dogs "lazy"
is een geldig woordenboek. Dezelfde sleutel kan meerdere keren zijn, maar het is precies alsof de waarde van laatstgenoemde in de waarde van de eerdere waarde was; dit zijn hetzelfde woordenboek:
abcd {1 2 3} defg {2 3 4} abcd {3 4 5}
abcd {3 4 5} defg {2 3 4}
Witruimte is onbelangrijk, net als bij lijsten.
Een belangrijk concept met woordenboeken is iteratievolgorde; woordenboeken proberen de sleutelinvoegvolgorde te gebruiken als hun iteratievolgorde, maar wanneer u de waarde voor een bestaande sleutel bijwerkt, overschrijft u de waarde van die sleutel. Nieuwe sleutels gaan aan het einde.
Referenties: dict
Lijst toevoegen aan een genest woordenboek
Als we dit woordenboek hebben:
set alpha {alice {items {}} bob {items {}} claudia {items {}} derek {items {}}}
En wil "vork" en "pinda" toevoegen aan Alice's items, deze code zal niet werken:
dict lappend alpha alice items fork peanut
dict get $alpha alice
# => items {} items fork peanut
Omdat het onmogelijk zou zijn voor de opdracht om te weten waar de sleuteltokens eindigen en de waarden die aan de lijst moeten worden toegevoegd, is de opdracht beperkt tot één sleuteltoken.
De juiste manier om aan het innerlijke woordenboek toe te voegen is deze:
dict with alpha alice {
lappend items fork peanut
}
dict get $alpha alice
# => items {fork peanut}
Dit werkt omdat het dict with commando ons geneste woordenboeken laat doorlopen, net zoveel niveaus als het aantal sleuteltokens dat we bieden. Vervolgens worden variabelen gemaakt met dezelfde namen als de toetsen op dat niveau (slechts één hier: items ). De variabelen worden geïnitialiseerd op de waarde van het overeenkomstige item in het woordenboek. Als we de waarde wijzigen, wordt die gewijzigde waarde gebruikt om de waarde van het woordenboekitem bij te werken wanneer het script eindigt.
(Merk op dat de variabelen blijven bestaan wanneer de opdracht is beëindigd.)
Basisgebruik van een woordenboek
Een woordenboek maken:
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
Woordenboeksleutels kunnen worden genest.
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"
}
}
Het dicteer-commando kan een fout veroorzaken
set alpha {a 1 b 2 c 3}
dict get $alpha b
# => 2
dict get $alpha d
# (ERROR) key "d" not known in dictionary
Als dict get wordt gebruikt om de waarde van een ontbrekende sleutel op te halen, wordt een fout gegenereerd. Gebruik dict exists om de fout te voorkomen:
if {[dict exists $alpha $key]} {
set result [dict get $alpha $key]
} else {
# code to deal with missing key
}
Hoe om te gaan met een ontbrekende sleutel hangt natuurlijk af van de situatie: een eenvoudige manier is om het result te stellen op een standaard "lege" waarde.
Als de code nooit probeert andere sleutels in het woordenboek op te dict get zal dict get natuurlijk niet mislukken. Maar voor willekeurige sleutels is dict get een bewerking die moet worden bewaakt. Bij voorkeur dict exists test met dict exists , hoewel het vangen van uitzonderingen ook werkt.
Herhalen over een woordenboek
U kunt de inhoud van een woordenboek herhalen met dict for , wat vergelijkbaar is met foreach :
set theDict {abcd {ab cd} bcde {ef gh} cdef {ij kl}}
dict for {theKey theValue} $theDict {
puts "$theKey -> $theValue"
}
Dit levert deze output op:
abcd -> ab cd bcde -> ef gh cdef -> ij kl
U krijgt dezelfde uitvoer door dict keys om de toetsen weer te geven en daarover te herhalen:
foreach theKey [dict keys $theDict] {
set theValue [dict get $theDict $theKey]
puts "$theKey -> $theValue"
}
Maar dict for is efficiënter.