配列

Tclは、文字列を添字とする連想配列を使うことができます。
配列の添字は、括弧ではさんで任意の文字列を指定します。
個々の配列要素の値は、$による変数展開で参照できます。
また、parrayコマンドを使うと全ての配列要素の値を一覧表示できます。

set ary(名前) 太郎
set ary(性別) 男
set ary(年齢) 10歳
puts "$ary(名前) $ary(性別) $ary(年齢)"
=> 太郎 男 10歳
set ary(名前) 太郎
set ary(性別) 男
set ary(年齢) 10歳
parray ary
=> ary(名前) = 太郎
=> ary(年齢) = 10歳
=> ary(性別) = 男

配列名と添字は、変数展開とコマンド展開の結果を使うことができます。
ただし、配列名に変数展開の結果を使う場合は、中括弧を使う必要があります。

set name ary
set ${name}(名前) 太郎
set ${name}(名前)
=> 太郎
set x ${name}(名前)
=> ary(名前)
set x [set ${name}(名前)]
=> 太郎
set index 名前
set ary($index) 太郎
set ary($index)
=> 太郎
set x $ary($index)
=> 太郎

配列名の添字に変数展開の結果を使うもう1つの例です。
for文で回して添え字を変化させています。

for {set index 0} {$index < 5} {incr index} {
    set ary($index) $index
}
parray ary
=> ary(0) = 0
=> ary(1) = 1
=> ary(2) = 2
=> ary(3) = 3
=> ary(4) = 4

arrayコマンド

arrayコマンドは配列に対する操作を行うためのコマンドです。
array setコマンドを使うと、リストから配列を作成することができます。

array set ary {
    名前 太郎
    性別 男
    年齢 10歳
}
parray ary
=> ary(名前) = 太郎
=> ary(年齢) = 10歳
=> ary(性別) = 男

arrayコマンドには以下のオプションがあります。

arrayコマンドのオプション
array exists arrayNamearrayNameが配列であれば1を返す。そうでなければ0を返す。
array get arrayName ?pattern?パターンにマッチした添字の要素のペアリストを返す。パターンを省略した場合は、全ての要素のペアリストを返す。パターンはglob形式を使います。
array names arrayName ?pattern?パターンにマッチした添字を返す。パターンを省略した場合は、全ての添字を返す。
array set arrayName listリストから配列を作成する。
array size arrayName配列の要素数を返す。
array unset arrayName ?pattern?パターンにマッチした添字の要素を削除する。パターンを省略した場合は、配列を削除する。

配列をリストに変換する例です。

array set ary {
    名前 太郎
    性別 男
    年齢 10歳
}
array get ary
=> 名前 太郎 年齢 10歳 性別 男

配列の添字をリストする例です。

array set ary {
    名前 太郎
    性別 男
    年齢 10歳
}
array names ary
=> 名前 年齢 性別

配列をコピーする例です。

array set ary {
    名前 太郎
    性別 男
    年齢 10歳
}
# 配列をコピーするプロシジャ
proc copy {ary1 ary2} {
    upvar $ary1 from $ary2 to
    foreach {index value} [array get from *] {
        set to($index) $value
    }
}
# コピー
copy ary foo
# 結果
parray foo
=> foo(名前) = 太郎
=> foo(年齢) = 10歳
=> foo(性別) = 男

2次元配列

Tclの連想配列は、1次元配列ですが、添字が文字列であるということを利用して、
以下のように、10行10列の2次元配列のようなものを表現することもできます。

for {set i 0} {$i < 10} {incr i} {
    for {set j 0} {$j < 10} {incr j} {
	set ary($i,$j) "$i,$j"
    }
}
parray ary
ary(0,0) = 0,0
ary(0,1) = 0,1
ary(0,2) = 0,2
...途中省略...
ary(9,7) = 9,7
ary(9,8) = 9,8
ary(9,9) = 9,9