一、介紹
Tcl 中的數組和其他高級語言的數組有些不同:Tcl 數組元素的索引,或稱鍵值,可以是任意的字符串,而且其本身沒有所謂多維數組的概念。數組的存取速度要比列表有優勢,數組在內部使用散列表來存儲,每個元素存取開銷幾乎相同,而列表的存取數據花非時間與其長度成正比。
二、數組的定義與格式
數組索引是由圓括號()來指定的,每個數組元素變量名的格式是“數組名(索引值)”。數組
元素使用 set 命令來定義和賦值:
[語法]:set arrName(index) value
也可以用 array 命令來定義一個數組:
[語法]:array set arrName { index1 value1 index2 value2 ...}
這個命令在定義數組的同時可以定義其元素和元素值。需要注意元素索引(index-n)與元素值(valun-n)要成對輸入,否則會出錯。用命令 array set arrName “”可以定義一個空數組。用普通變量值的獲取方法——替換操作來獲取數組元素值:
[語法]:set val $arrName(index)
數組元素索引也支持替換操作,包括變量和命令替換,如:
[語法]: set val $arrName($index)
set val $arrName([expr $index + 1])
Tcl 數組索引的值不象其他高級語言如 C 語言那樣,要求一定是整數。Tcl 允許索引值為包括數字字符在內的所有合法字符組成的字符串。
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
三、多維數組
在有些時候,可能需要象 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
四、數組操作指令
命令格式 |
說明 |
array exists arr |
判斷 arr 是否為數組變量,是返回 1 |
array get arr ?pattern? |
返回一個包含交替出現索引、元素值的列表。pattern 選擇匹配索引。如果不指定 pattern,返回所有的元素索引和值。 |
array names arr ?pattern? |
返回索引 |
array set arr list |
初始化數組 |
array size arr |
數組大小 |
array startsearch arr |
返回用於 arr 進行搜索的搜索標記 |
array nextelement arr index |
返回下一個元素值,如果已在尾部的話,返回空串 |
array donesearch arr index |
結束有 index 標識的搜索 |
parray arr |
打印出 arr 的所有元素變量名和元素值 |
1.array get 命令
array get 命令提取數組索引、元素值對並將這些值對組織成一個列表。而 array set 命令 則將一個列表(數據要成對)轉換成一個數組。例
array set arr [list a AAA b BBB c CCC d DDD] array size arr ;#數組元素個數 結果=> 4 parray arr 結果=> arr(a) = AAA arr(b) = BBB arr(c) = CCC arr(d) = DDD set l1 [array get arr] 結果=> d DDD a AAA b BBB c CCC
2.array names命令
array names 返回所有元素索引名與模式 pattern 匹配的元素索引名列表。模式 pattern 和 string match 的模式格式相同。如果 pattern 沒有指定,則返回所有數組元素索引名列表。
array set a [list "School,BUPT" "BUPT" "School,NJU" "NJU" "School,NJUA" "NJUA"] % parray a 結果=> a(School,BUPT) = BUPT a(School,NJU) = NJU a(School,NJUA) = NJUA array names a "School,*" 結果=>School,NJU School,NJUA School,BUPT array names a "School,N*" 結果=>School,NJU School,NJUA array names a 結果=>School,NJU School,NJUA School,BUPT