TCL支持通过数组的形式存储多个元素。
Tcl中的数组和其他高级语言的数组有些不同:Tcl 数组元素的索引,或称键值,可以是任意的字符串,而且其本身没有所谓多维数组的概念。数组的存取速度要比列表有优势,数组在内部使用散列表来存储,每个元素存取开销几乎相同,而列表的存取数据花费时间与其长度成正比。
一、数组的定义和格式
1.数组索引是由圆括号()来指定的,每个数组元素变量名的格式是“数组名(索引值)”。数组元素使用 set 命令来定义和赋值:
[语法]:set arrName(index) value
2.也可以用 array 命令来定义一个数组:
[语法]:array set arrName { index1 value1 index2 value2 ...}
这个命令在定义数组的同时可以定义其元素和元素值。需要注意元素索引(index-n)与元素 值(valun-n)要成对输入,否则会出错。用命令 array set arrName “”可以定义一个空数组。
3.用普通变量值的获取方法——替换操作来获取数组元素值:
[语法]:set val $arrName(index)
4.数组元素索引也支持替换操作,包括变量和命令替换,如:
[语法]: set val $arrName($index)
set val $arrName([expr $index + 1])
Tcl 数组索引的值不象其他高级语言如 C 语言那样,要求一定是整数。Tcl 允许索引值为包 括数字字符在内的所有合法字符组成的字符串。
可以使用 unset 命令来取消一个数组变量定义。
>array set arr1 "" ;#定义了一个空数组
>set array01(5) "Hello World"
=> Hello World
>puts $array01(5)
=>Hello World
>set array01(Hello) World
=> World
>puts $array01(Hello)
=> World
>array names array01 ;#array names 命令显示数组元素名
=> Hello 5
>array set arr2 {1 a 2 b 3 c 4 d}
>array names arr2
=> 4 1 2 3
>parray arr2 ;# 输出数组全部内容
=> arr2(1) = a
arr2(2) = b
arr2(3) = c
arr2(4) = d
二、数组变量
可以象使用普通变量一样来使用数组变量元素。如使用 info exist 来检测它是否存在,使用 incr 来递增它的值,使用 lappend 列表操作来追加列表元素等。
>set arr(1) 10
>incr arr(1)
=>11
将一个已经定义的普通变量当作数组变量使用或者将已定义的数组变量当作普通变量赋值是 错误的:
>set arr 10 ;#定义了一个普通变量
=>10
>set arr(a) 5 ;#试图将普通变量当作数组使用时出错
=> can't set "arr(a)": variable isn't array
>unset arr ;#取消变量定义
>set arr(a) 5 ;#ok
=> 5
>set arr 10 ;#试图赋值给数组变量时出错
=> can't set "arr": variable is array
可以使用替换获得数组名,通过替换间接使用数组变量
>set name Arr
=> Arr %set ${name}(1) abc
=> abc
>puts $Arr(1)
=> abc
三、多维数组
在有些时候,可能需要象 C 语言这样:
int arr[2][2]
arr[0][0] = 100
来定义一个多维数组来处理数据。Tcl 并没有直接支持这种数组的格式,使用者自己可以定 义所谓的多维数组,如:
>set arr(0,0) 100
=>set arr(0,1) 200
>parray arr
=> arr(0,0) = 100
arr(0,1) = 200
由于 Tcl 数组索引的灵活性,使用时要小心,否则可能得不到预期的结果,如忘记了上面索 引的逗号,就成了:
>set arr(00) 100
>parray arr
=> arr(0,0) = 100
arr(0,1) = 200
arr(00) = 100
四、数组操作命令
数组就象字符串和列表一样,也有一套专门的操作命令。下图给出了这些命令的语法和说明。