说到了数组,马上就有人想到了C语言中的数组,也有人会想到了我在前面的文章中提到,TCL中的列表和C语言的数组类似,可能有人就开始迷糊了?那么TCL中的数组究竟是什么样子呢?
在TCL中,数组是带有字符串值索引的变量,请注意,是字符串索引,而不是数字索引,所以这里就是TCL数组的最大不同。在数组内部,是用了散列表。
数组的索引是写在数组名后的圆括号中,
格式为
arrayname(index)
如这个程序:
#!/usr/bin/tclsh
set arr(test1) 1
set arr(test2) 2
puts $arr(test1)
set var1 $arr(test2)
puts $var1
其运行结果为
1
2
能看到,还可以通过$arr(test)来获得相应的值或者赋值给其他变量。
对于数组的操作命令如下:
命令 | 说明 |
array exist arr | 如果arr是数组的话,就返回1 |
array get arr ?pattern | 返回一个包含交替出现索引和对应数组值的列表,pattern是匹配索引,在没指定的情况下,匹配所有 |
array names arr? pattern | 返回包含为arr定义的所有索引的列表,或是返回那些与字符串匹配模式pattern匹配的索引 |
array set arr list | 根据list初始化数组 |
array size arr | 返回为array定义的索引的数量 |
array startsearch arr | 返回用于对array进行搜索的标记 |
array nextelement arr id | 返回在记号id所标识的搜索中的数组的下一个元素的值,如果没有,就返回空 |
array anymore arr id | 如果搜索中还有剩余的元素,就返回1 |
array donesearch arrid | 结束由id标识的搜索 |
下面看一个例子,将会用到上面的部分命令
#!/usr/bin/tclsh
set list1 [list color1 red color2 yellow color3 blue]
# Use array set to change the list to array
array set array1 $list1
# Use array exist to detect this array
puts [array exist array1]
# Use array names to print all the index
puts [array names array1]
# Use array size to print the size of array
puts [array size array1]
其执行结果如下
1
color1 color2 color3
3
而对于一个数组来说,如果想输出该数组所有的值,就可以使用array names先获得键值的列表,然后通过对这个列表的遍历获得每个键值对应的数组值,最后输出数组值。看这个程序。
#!/usr/bin/tclsh
set list1 [list color1 red color2 yellow color3 blue]
# Use array set to change the list to array
array set array1 $list1
# Use array names to print all the index
set aindex [array names array1]
for {set i 0} {$i<[llength $aindex]} {incr i} {
puts $array1([lindex $aindex $i])
}
其运行结果为:
red
yellow
blue
同样的,如果要将数组变为列表的话,也需要通过先获得键值列表,然后获得数组值的方法,最后用lappend来具体实现,有兴趣的朋友可以自己试试。