| 
array set age {
    Nat   24
    Jules 25
    Josh  17
}
 
set age(Nat)   24
set age(Jules) 25
set age(Josh)  17
 
array set foodColor {
    Apple   red
    Banana  yellow
    Lemon   yellow
    Carrot  orange
} | 
| set array(foo) bar # or set key foo set value bar set array($key) $value # or array set array [list $key $value] # foodColor defined per the introduction set foodColor(Raspberry) pink puts "Known foods:" foreach food {[array names foodColor]} { puts $food } | 
| if {[info exists array($key)]} { # it exists } else { # it doesn't } # foodColor per the introduction foreach name {Banana Martini} { if {[info exists foodColor($name)]} { puts "$name is a food." } else { puts "$name is a drink."; } } array unset age set age(Toddler) 3 set age(Unborn) 0 set age(Phantasm) false foreach thing {Toddler Unborn Phantasm Relic} { set result "$thing:" if {[info exists age($thing)]} { append result " Exists" if {$age($thing)} { append result " True" } if {$age($thing) != 0} { append result " Non-zero" } } puts $result } ;# improved by Bob Techentin | 
| # remove $KEY and its value from ARRAY array unset ARRAY $KEY # foodColor as per Introduction proc print-foods {} { variable foodColor set foods [array names foodColor] set food {} puts "Keys: $foods" puts -nonewline "Values: " foreach food $foods { set color $foodColor($food) if {$color ne {}} { puts -nonewline "$color " } else { puts -nonewline {(empty) } } } puts {} } puts "Initially:" print-foods puts "\nWith Banana empty" set foodColor(Banana) {} print-foods puts "\nWith Banana deleted" array unset foodColor Banana print-foods # => Initially: # => Keys: Banana Apple Carrot Lemon # => Values: yellow red orange yellow # => # => With Banana empty # => Keys: Banana Apple Carrot Lemon # => Values: (empty) red orange yellow # => # => With Banana deleted # => Keys: Apple Carrot Lemon # => Values: red orange yellow # several members can be deleted in one # go if their names match a glob pattern, # otherwise the [array unset] command must # be called once for each name. array unset foodColor ?a* print-foods # => Keys: Apple Lemon # => Values: red yellow | 
| foreach {key value} [array get ARRAY] { # do something with $key and $value } # another way set searchId [array startsearch ARRAY] while {[set key [array nextelement ARRAY $searchId]] ne {}} { set value $ARRAY($key) # do something with $key and $value } foreach {food color} [array get foodColor] { puts "$food is $color." } # => Banana is yellow. # => Apple is red. # => Carrot is orange. # => Lemon is yellow. set searchId [array startsearch foodColor] while {[set food [array nextelement foodColor $searchId]] ne {}} { set color $foodColor($food) puts "$food is $color." } # => Banana is yellow. # => Apple is red. # => Carrot is orange. # => Lemon is yellow. # countfrom - count number of messages from each sender if {[llength $argv] > 0} { if {[catch {set f [open [lindex $argv 0]]} err]} { error $err } } else { set f stdin } while {[gets $f line] >= 0} { if {[regexp {^From: (.*)} $line --> name]} { if {[info exists from($name)]} { incr from($name) } else { set from($name) 1 } } } if {[array size from] == 0} { puts "No senders found" exit } foreach person [lsort [array names from]] { puts "$person: $from($person)" } | 
| # print each member of the array... foreach {k v} [array get ARRAY] { puts "$k => $v" } # ...or print all of it at once... puts [array get ARRAY] # ...or copy it to a list variable and print that... set temp [array get ARRAY] puts $temp # ...or use the inspection command [parray] parray ARRAY # print with sorted keys foreach {k} [lsort [array names ARRAY]] { puts "$k => $ARRAY($k)" } | 
| # @@INCOMPLETE@@
# @@INCOMPLETE@@
 | 
| # A list is a string in Tcl, so there is # no problem storing multiple values as an # array ("hash") item. array set ttys [list] set WHO [open "|who"] while {[gets $WHO line] > -1} { foreach {user tty} [split $line] break lappend ttys($user) $tty } close $WHO foreach user [lsort [array names ttys]] { puts "$user: $ttys($user)" } # dummy code; there is no getpwuid command foreach user [lsort [array names ttys]] { puts "$user: [llength $ttys($user)] ttys." foreach tty [lsort $ttys($user)] { if {![catch {file stat /dev/$tty stat}]} { set user [lindex [getpwuid $stat(uid)] 0] } else { set user "(not available)" } puts "\t$tty (owned by $user)" } } proc multihash_delete {arrayname key value} { upvar $arrayname array set i {} set len [llength $array($key)] for {set i 0} {$i < $len} {incr i} { if {[lindex $array($key) $i] eq $value} { lset array($key) [lreplace $array($key) $i $i] break } } if {[llength $array($key)] <= 0} { array unset array $key } } | 
| #----------------------------- package require struct 1.4 array set REVERSE [::struct::list reverse [array get LOOKUP]] #----------------------------- # foodfind - find match for food or color package require struct 1.4 proc foodfind foodOrColor { array set color { Apple red Banana yellow Lemon yellow Carrot orange } array set food [::struct::list reverse [array get color]] if {[info exists color($foodOrColor)]} { puts "$foodOrColor is a food with color $color($foodOrColor)." } if {[info exists food($foodOrColor)]} { puts "$food($foodOrColor) is a food with color $foodOrColor." } } foreach {f c} [array get color] { lappend food($c) $f } puts "[join $food(yellow)] were yellow foods." | 
| #----------------------------- # a is the array to sort set keys [lsort OPTIONS [array names a]] foreach key $keys { set value $a($key) # do something with $key, $value } #----------------------------- foreach food [lsort [array names foodColor]] { puts "$food is $foodColor($food)." } #----------------------------- proc sortFoods {a b} { expr {[string length $a] - [string length $b]} } foreach food [lsort -command sortFoods [array names foodColor]] { lappend foods $food } foreach food $foods { puts "$food is $foodColor($food)." } #----------------------------- | 
| #----------------------------- array set merged [concat [array get A] [array get B]] #----------------------------- array unset merged foreach {k v} [array get A] { set merged($k) $v } foreach {k v} [array get B] { set merged($k) $v } #----------------------------- # foodColor as per the introduction array set drinkColor { Galliano yellow "Mai Tai" blue } array set ingestedColor [concat [array get drinkColor] [array get foodColor]] #----------------------------- # foodColor per the introduction, then array set drinkColor { Galliano yellow "Mai Tai" blue } array unset ingestedColor foreach {k v} [array get foodColor] { set ingestedColor($k) $v } foreach {k v} [array get drinkColor] { set ingestedColor($k) $v } #----------------------------- foreach substanceref {foodColor drinkColor} { foreach {k v} [array get $substanceref] { set substanceColor($k) $v } } #----------------------------- foreach substanceref {foodColor drinkColor} { foreach {k v} [array get $substanceref] { if {[info exists substanceColor($k)]} { puts "Warning: $k seen twice. Using the first definition." continue } set substanceColor($k) $v } } #----------------------------- | 
| #----------------------------- set common {} foreach k [array names arr1] { if {[info exists arr2($k)]} { lappend common $k } } # common now contains common keys #----------------------------- set thisNotThat {} foreach k [array names arr1] { if {![info exists arr2($k)]} { lappend thisNotThat $k } } #----------------------------- # foodColor per the introduction # citrusColor is an array mapping citrus food name to its color. array set citrusColor { Lemon yellow Orange orange Lime green } # build up a list of non-citrus foods set nonCitrus {} foreach k [array names foodColor] { if {![info exists citrusColor($k)]} { lappend nonCitrus $k } } #----------------------------- #----------------------------- | 
| #----------------------------- # @@INCOMPLETE@@ # @@INCOMPLETE@@ #----------------------------- | 
| #----------------------------- # @@INCOMPLETE@@ # @@INCOMPLETE@@ #----------------------------- | 
| #----------------------------- array unset count foreach element $LIST { if {![info exists count($element)]} { set count($element) 1 } else { incr count($element) } } #----------------------------- | 
| #-----------------------------
array set father {
        Cain            Adam
        Abel            Adam
        Seth            Adam
        Enoch           Cain
        Irad            Enoch
        Mehujael        Irad
        Methusael       Mehujael
        Lamech          Methusael
        Jabal           Lamech
        Jubal           Lamech
        Tubalcain       Lamech
        Enos            Seth
}
#-----------------------------
foreach name {Adam Tubalcain Elvis Enos} {
        set fathers {}
        while {[info exists father($name)]} {    ;# if <name> has a father
                lappend fathers $name            ;# add it to the list
                set name $father($name)         ;# and check the father's father
        }
        puts $fathers
}
#-----------------------------
foreach {k v} [array get father] {
        lappend children($v) $k
}
set sep {, }                ;# separate output with commas
foreach name {Adam Tubalcain Elvis Lamech} {
        if {[info exists children($name)] && [llength children($name)]} {
                set res $children($name)
        } else {
                set res nobody
        }
        puts "$name begat [join $res $sep]"
}
#-----------------------------
foreach file $files {
        if {[catch {open $file} F]} {
                puts stderr "Couldn't read $file: $F; skipping."
                continue
        }
        while {[gets $F line] >= 0} {
                if {![regexp {^\s*#\s*include\s*<([^>]+)>} $line --> name]} {
                        continue
                }
                lappend includes($name) $file
        }
        close $F
}
#-----------------------------
set includeFree {}                  ;# list of files that don't include others
foreach k [array names includes] {
        set uniq($k) {}
}
forech file [lsort [array names uniq]] {
        if {![info exists includes($file)]} {
                lappend includeFree $file
        }
}
#----------------------------- | 
| #----------------------------- # @@INCOMPLETE@@ # @@INCOMPLETE@@ #----------------------------- |