List > concat命令
语法:concat list ?list...?
这个命令把多个list合成一个list,每个list变成新list的一个元素。
List > lindex命令
语法:lindex list index
返回list的第index个(0-based)元素。例: % lindex {1 2 {3 4}} 2 3 4
List > llength命令
语法:llength list 返回list的元素个数。例 % llength {1 2 {3 4}} 3
List > linsert命令
语法:linsert list index value ?value...?
返回一个新串,新串是把所有的value参数值插入list的第index个(0-based)元素之前得到。例:
% linsert {1 2 {3 4}} 1 7 8 {9 10} 1 7 8 {9 10} 2 {3 4} List > lreplace命令
语法:lreplace list first last ?value value ...?
返回一个新串,新串是把list的第firs (0-based)t到第last 个(0-based)元素用所有的value参数替换得到的。如果没有value参数,就表示删除第first到第last个元素。例: % lreplace {1 7 8 {9 10} 2 {3 4}} 3 3 1 7 8 2 {3 4}
% lreplace {1 7 8 2 {3 4}} 4 4 4 5 6 1 7 8 2 4 5 6
11
List > lrange命令
语法:lrange list first last
返回list的第first (0-based)到第last (0-based)元素组成的串,如果last的值是end。就是从第first个直到串的最后。 例:
% lrange {1 7 8 2 4 5 6} 3 end 2 4 5 6 List > lappend命令
语法:lappend varname value ?value...?
把每个value的值作为一个元素附加到变量varname后面,并返回变量的新值,如果varname不存在,就生成这个变量。例: % lappend a 1 2 3 1 2 3 % set a 1 2 3 List > lsearch命令
语法:lsearch ?-exact? ?-glob? ?-regexp? list pattern
返回list中第一个匹配模式pattern的元素的索引,如果找不到匹配就返回-1。-exact、-glob、 -regexp是三种模式匹配的技术。-exact表示精确匹配;-glob的匹配方式和string match命令的匹配方式相同,将在后面第八节介绍string命令时介绍;-regexp表示正规表达式匹配,将在第八节介绍regexp命令时介绍。缺省时使用-glob匹配。例: % set a { how are you } how are you % lsearch $a y* 2
% lsearch $a y? -1
List > lsort命令
语法:lsort ?options? list
这个命令返回把list排序后的串。options可以是如下值: -ascii 按ASCII字符的顺序排序比较.这是缺省情况。 -dictionary 按字典排序,与-ascii不同的地方是:
1 2
(1)不考虑大小写
(2)如果元素中有数字的话,数字被当作整数来排序.
因此:bigBoy排在bigbang和bigboy之间, x10y 排在x9y和x11y之间. -integer 把list的元素转换成整数,按整数排序. -real 把list的元素转换成浮点数,按浮点数排序. -increasing 升序(按ASCII字符比较) -decreasing 降序(按ASCII字符比较)
-command command TCL自动利用command 命令把每两个元素一一比较,然后给出排序结果。
List > split命令
语法:split string ?splitChars?
把字符串string按分隔符splitChars分成一个个单词,返回由这些单词组成的串。如果splitChars
是一个空字符{},string被按字符分开。如果splitChars没有给出,以空格为分隔符。例: % split \ how are you
% split \ how are you
% split \ h o w { } a r e { } y o u List > join命令
语法:join list ?joinString?
join命令是命令的逆。这个命令把list的所有元素合并到一个字符串中,中间以joinString分开。缺省的joinString是空格。例: % join {h o w { } a r e { } y o u} {} how are you
% join {how are you} . how.are.you 控制流 > if命令
TCL中的控制流和C语言类似,包括if、while、for、foreach、switch、break、continue等命令。
语法: if test1 body1 ?elseif test2 body2 elseif.... ? ?else bodyn?
TCL先把test1当作一个表达式求值,如果值非0,则把body1当作一个脚本执行并返回所得
13
值,否则把test2当作一个表达式求值,如果值非0,则把body2当作一个脚本执行并返回所得值……。例如: if { $x>0 } { .....
}elseif{ $x==1 } { .....
}elseif { $x==2 } { .... }else{ ..... }
注意,上例中'{'一定要写在上一行,因为如果不这样,TCL 解释器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而导致错误的结果。在下面的循环命令的书写中也要注意这个问题。书写中还要注意的一个问题是if 和{之间应该有一个空格,否则TCL解释器会把'if{'作为一个整体当作一个命令名,从而导致错误。
控制流 > 循环命令
循环命令包括while、for、foreach等。 ■while命令
语法为: while test body
参数test是一个表达式,body是一个脚本,如果表达式的值非0,就运行脚本,直到表达式为0才停止循环,此时while命令中断并返回一个空字符串。 例如:
假设变量 a 是一个链表,下面的脚本把a 的值复制到b: set b \
set i [expr [llength $a] -1] while { $i>=0}{ lappend b [lindex $a $i] incr i -1 } ■for命令
语法为: for init test reinit body
参数init是一个初始化脚本,第二个参数test是一个表达式,用来决定循环什么时候中断,第三个参数reinit是一个重新初始化的脚本,第四个参数body也是脚本,代表循环体。下例与上例作用相同:
1 4
set b \
for {set i [expr [llength $a] -1]} {$i>=0} {incr i -1} { lappend b [lindex $a $i] } ■foreach命令 这个命令有两种语法形式 1、 foreach varName list body
第一个参数varName是一个变量,第二个参数list 是一个表(有序集合),第三个参数body是循环体。每次取得链表的一个元素,都会执行循环体一次。 下例与上例作用相同: set b \ foreach i $a{
set b [linsert $b 0 $i] }
2、 foreach varlist1 list1 ?varlist2 list2 ...? Body
这种形式包含了第一种形式。第一个参数varlist1是一个循环变量列表,第二个参数是一个列表list1,varlist1中的变量会分别取list1中的值。body参数是循环体。 ?varlist2 list2 ...?表示可以有多个变量列表和列表对出现。例如: set x {}
foreach {i j} {a b c d e f} { lappend x $j $i }
这时总共有三次循环,x的值为\。 set x {}
foreach i {a b c} j {d e f g} { lappend x $i $j }
这时总共有四次循环,x的值为\。 set x {}
foreach i {a b c} {j k} {d e f g} { lappend x $i $j $k }
这时总共有三次循环,x的值为\。
15