1. 数组的定义与格式
数组索引是由圆括号()来指定的,每个数组元素变量名的格式是“数组名(索引值)”。数组元素使用 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
2. 数组变量
可以象使用普通变量一样来使用数组变量元素。如使用 info exist 来检测它是否存在,使用incr 来递增它的值,使用 lappend 列表操作来追加列表元素等。
示例:
-
set arr(1) 10
-
incr arr(1)
-
=> 11
-
可以使用替换获得数组名,如:
-
set name Arr
-
=> Arr
-
-
set ${name}(1) abc
-
=> abc
-
-
puts $Arr(1)
-
=> abc
-
3. 多维数组
Tcl 并没有直接支持像C语言数组的格式,使用者自己可以定义所谓的多维数组,如:
-
set arr(0, 0) 100
-
set arr(0, 1) 200
-
parray arr
- => arr(0, 0) = 100
- arr(0, 1) = 200
4. 数组操作命令
数组操作命令表:
命令格式 | 说明 |
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 的所有元素变量名和元素值 |
4.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
-
4.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
4.3 遍历数组
如何对未知数组的每个元素进行操作呢,这可有多种方法。下面的例子提供了一个途径:
-
array set a1 [list a AAA b BBB c CCC d DDD]
-
set l1 [array names a1]
-
=> d a b c
-
foreach id $l1 {
puts "a1($id) = $a1($id)"
}
-
- => a1(d) = DDD
a1(a) = AAA
a1(b) = BBB
a1(c) = CCC
array names 返回的元素索引的时候,最后一个元素的索引被放置到了列表的第一个位置上。
4.4 用数组定义结构
Tcl 语言中没有结构类型,可以通过数组定义来实现相似的功能。
-
array set Struct [list name_ "" type_ "" value_ ""]
-
parray Struct
- => Struct(name_) =
Struct(type_) =
Struct(value_) =
标签:School,set,元素,arr,数组,array From: https://www.cnblogs.com/love-9/p/18134223