发表于:2010-02-25 20:29:23
楼主
循环命令包括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也是脚本,代表循环体。下例与上例作用相同:
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 【lins ert $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的值为"b a d c f e"。
set x {}
foreach i {a b c} j {d e f g} {
lappend x $i $j
}
这时总共有四次循环,x的值为"a d b e c f {} g"。
set x {}
foreach i {a b c} {j k} {d e f g} {
lappend x $i $j $k
}
这时总共有三次循环,x的值为"a d e b f g c {} {}"。
■break和continue命令
在循环体中,可以用break和continue命令中断循环。其中break命令结束整个循环过程,并从循环中跳出,continue只是结束本次循环。
■switch 命令
和C语言中switch语句一样,TCL中的switch命令也可以由if命令实现。只是书写起来较为烦琐。 switch命令的语法为: switch ? options? string { pattern body ? pattern body ...?}
第一个是可选参数options,表示进行匹配的方式。TCL支持三种匹配方式:-exact方式,-glob方式,-regexp方式,缺省情况表示-glob方式。-exact方式表示的是精确匹配,-glob方式的匹配方式和string match 命令的匹配方式相同(第八节介绍),-regexp方式是正规表达式的匹配方式(第八节介绍)。第二个参数string 是要被用来作测试的值,第三个参数是括起来的一个或多个元素对,例:
switch $x {
a -
b {incr t1}
c {incr t2}
default {incr t3}
}
其中a的后面跟一个‘-‘表示使用和下一个模式相同的脚本。default表示匹配任意值。一旦switch命令 找到一个模式匹配,就执行相应的脚本,并返回脚本的值,作为switch命令的返回值。