Associative Arrays

Associative arrays are an important generalization of common arrays.

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.

Keith Waclena
The University of Chicago Library
This page last updated: Mon Jul 25 14:13:51 CDT 1994
This page was generated from Extended HTML by xhtml.