Associative Arrays
Associative arrays are an important generalization of common arrays.
- Arrays in most languages can only be indexed by integers (sometimes only by non-negative integers).
- Arrays in Tcl are indexed by arbitrary strings.
- Associative arrays can be used like common arrays simply by only using numbers to index them.
Tcl’s associative arrays are implemented as hash tables for efficiency.
History of Associative Arrays
Associative arrays were first used in the programming language Snobol4 in the mid-1960s. They are a very common data structure in the Unix environment, being provided as the major data structure by languages like Awk, Perl, etc.
Uses of Associative Arrays
Associative arrays can be used to represent 1- and N-dimensional arrays, sequential structures like lists and queues (though Tcl provides these natively), symbol tables, Cartesian products (i.e., the structs of C, the records of Pascal), graphs, sets, and more.
Accessing Associative Array Elements
There is a special notation for array names which is used to access array elements:
set a(1) 0 set salary(Smith) 30000 set age(Smith) 45 set "x(white space)" foo set s "This is a kind of long string" set length($s) [string length $s]
Variable substitution with$
works with arrays:
puts $age(Smith) expr $age(Smith) + $length($s)
Note the difference between these forms:
set {white space(Smith)} foo puts ${white space}(Smith) puts ${white space(Smith)} puts [set {white space(Smith)}]
The array names
Command
The array names
command returns a list of all the indices (names) of an array:
set a(1) 0 set a(foo) 1 set a("x y") bar array names a => foo {x y} 1
The indices are returned in random order, because the array elements are stored in random order.
The array size
Command
The array size
command returns the number of elements in an array:
array size a => 3
expr [array size a] == [llength [array names a]]
will always be 1 (true) for any array a
Unsetting Arrays
The unset command works on both array elements and entire arrays.
Iterating Over Associative Arrays
foreach i [array names a] { puts "a($i): $a($i)" }
Multidimensional Arrays
Tcl doesn’t have multidimensional arrays, but associative arrays can simulate them easily:
set a(1,1) 0 set a(1,2) 0 set a(1,3) 0 set a(2,1) 0 set a(2,2) 0 set a(2,3) 0
This works because the array indices are, as always, strings.