发表于: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命令的返回值。