配列(array)とは、データ構造の1つで、値を格納する為の入れ物(変数)を複数並べた構造をしています。
この記事はTclにおけるリストと配列の違いと配列の作成方法を紹介します。
Tclにおけるリストと配列の違い
Tclのリストは、1つの変数に複数の要素を空白で区切ったデータ構造をしています。このリストデータは、空白を含む単なる文字列という扱いです。
言い方を変えると、空白で区切られた要素の集合体が1つの変数データとして1つの箱に納まっています。
それに対して配列は、1つの変数の中に複数の要素が、それぞれ別々の箱に納まっているというイメージです。
正確に言うと、Tclの配列は「変数名(key)」ではなく「配列名(key)」や「配列名(要素名)」となり、要素名でインデックス付け可能な変数の集まりです。
配列は複数の変数が格納されたコンテナ(入れ物)というイメージなので配列自体に値を持っていません。配列内の変数値を参照するには配列名(key)の形式で配列名とキーを指定する必要があります。
Tclの配列
Tclの配列は、キー(key)と値(value)がペアになったデータ構造をしています。キーには文字列を使う事が出来ます。*1
1つの配列には複数の箱があり、それぞれの箱に名前(key)を付けて管理するというイメージです。*2
このようにキーに文字を使う配列のことを連想配列と言います。他の言語では連想配列の事を辞書(dictionary)、ハッシュ(hash)、マップ(map)などと呼ぶことがあります。*3
*1
配列の説明をする場合、キー(key)の事を要素名または要素の名前または添え字、値(value)の事を要素値または要素の値と呼ぶこともあります。
*2
正確に言うと、配列内部では名前(key)そのもので管理しているわけではなく、keyを元にハッシュ関数で生成したハッシュ値とハッシュテーブルで管理しています。ハッシュについては別途紹介します。
*3
Tcl8.5では、配列の高速性とリストの操作性を兼ね備えたdictコマンドが追加されました。dictコマンドについては別途紹介します。
配列の作成
配列を作成するには、setコマンドで作成する方法と、arrayコマンドで作成する方法があります。
作成した配列は、変数と同じようにsetコマンドで値を書き換えることが出来ます。
setコマンドで作成する
setコマンドで配列を作成する場合、配列の各要素に値を1つずつ代入していきます。
[使用例]
# 配列の作成と各要素の値を代入する。
% set arr(id) 100
100
% set arr(name) taro
taro
% set arr(tel) 12345678
12345678
# 配列の要素の値を参照する。
% set arr(id)
100
% puts "id = $arr(id)"
id = 100
# 配列名(keyを省略)だけ指定しても値の参照はできません。
% set arr
can not read "arr": variable is array
# parrayコマンドは、配列のkeyと値の一覧を表示します。
% parray arr
arr(id) = 100
arr(name) = taro
arr(tel) = 12345678
# 要素名(key)には$記号による変数置換も使えます。
% set key name
name
% set arr($key)
taro
arrayコマンドで作成する
arrayコマンドは、複数のオプションがあります。
arrayコマンドのsetオプションを使用すると、一度に1つ以上の要素の値を設定することが出来ます。
[書式]
array set arrayName list
listは、偶数の要素数で構成されている必要があります。
[使用例]
% array set arr {
id 100
name taro
tel 12345678
}
% parray arr
arr(id) = 100
arr(name) = taro
arr(tel) = 12345678
% array set arr2 {
id 101
name {}
tel {}
}
% parray arr2
arr2(id) = 101
arr2(name) =
arr2(tel) =
% set arr2(name) hanako
hanako
% parray arr2
arr2(id) = 101
arr2(name) = hanako
arr2(tel) =
要素名(key)に数字を使う
要素名(key)に数字を使うとリストと同じように順番に値を参照する事が出来ます。要素名に使用する数字も単なる文字列です。
[使用例] total2.tcl 合計を計算する。
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
set arr(0) 11
set arr(1) 12
set arr(2) 13
set arr(3) 14
set arr(4) 15
set sum 0 ;# 初期化
for {set n 0} {$n < 5} {incr n} {
puts "arr($n) = $arr($n)"
set sum [expr $sum + $arr($n)]
}
puts "合計: $sum"
[実行例]
$ ./total2.tcl
arr(0) = 11
arr(1) = 12
arr(2) = 13
arr(3) = 14
arr(4) = 15
合計: 65
コメント