Tcl 流程控制命令与C程序语言和Unix 外壳csh控制语句相似。包括if、while、for、foreach、switch以及eval等。
一、if 命令
set x -1
if {$x < 0} {
puts "x < 0"
} elseif {$x == 0} {
puts "x = 0"
} elseif {$x == 1} {
puts "x = 1"
}
注:每一个左大括号都必须在它的前一个单词的同一行,因为换行符就是命令分隔符。if {$x < 0} { 语句中末尾的{需和if语句写在同一行。
二、switch命令
switch命令用一个值和很多模式比较,执行能匹配的那个模式对应的Tcl脚本。
存在以下两种调用形式:
switch $x {a {incr t1} b {incr t2} c {incr t3}
switch $ a {incr t1} b {incr t2} c {incr t3}
写成多行形式,第一中形式会更方便。
switch $x {
a {incr t1}
b {incr t2}
c {ince t3}
}
switch $x \
a {incr t1} \
b {incr t2} \
c {incr t3}
switch 支持三种模式匹配方式,可以在给出检测值前指定选项:
-exact: 严格的字符串比较,模式行为。
-glob: string match 命令下的匹配
-regexp: 正则表达式匹配,还可以指定-matchvar参数。
如检测值从-符号开始,switch命令可能会把它误认为选项导致错误。通常应使用–选项来标记`。
如switch命令的最后一个模式是default,则它可以与任意值匹配。
set t1 0
set t2 0
set t3 0
foreach i $x {
switch -regexp -- $i {
a {incr t1}
^[0-9]+$ {incr t2}
default {ince t3}
}
}
如switch命令的某个脚本是-,那么switch会使用下一个模式对应的脚本。在多个模式对应相同的脚步时,这可以使脚本更加简洁。
switch -- $x {
a -
b -
c {incr t1}
d {incr t2}
}
switch 语句中的注释,只能在Tcl解释器期望找到Tcl命令的地方添加注释,即只能把注释加在脚本部分。
三、循环命令:while、for和foreach
Tcl提供三个用于循环的命令,这些命令可以把一段脚本执行多遍。
3.1 while命令
下面这段脚本,把列表从变量a中复制到变量b中,并在复制时倒转列表中元素的顺序。
set a [list 1 2 3 4 5]
set b {}
set i [expr {[llength $a] - 1}]
while {$i >= 0} {
lappend b [lindex $a $i]
incr i -1
}
puts $b
3.2 for 命令
for 循环可以将所有的循环控制信息集中放在一起,易与查看。
set a [list 1 2 3 4 5]
set b {}
for {set i [expr {[llength $a] -1}]} {$i >= 0} {incr i -1} {
lappend b [lindex $a $i]
}
puts $b
3.3 foreach命令
set a [list 1 2 3 4 5]
set b {}
foreach i $a {
set b [linsert $b 0 $i]
}
puts $b
除了使用一个简单变量名,foreach命令也接受变量名列表。此时每次循环都会依次把元素值赋给对应的变量,因此如果传入三个变量名,foreach每次就处理传到列表中的三个元素。如最后一次循环时列表中的剩余元素少于变量名列表中变量名个数,没有对应元素的变量设置为空字符串。
foreach {x y} {a b c d e} {
puts "<$x><$y>"
}
foreach 命令还可以并行地处理多个列表,每个列表需要提供独立地变量集。
foreach i {a b} {j k} {1 2 3 4} {
puts "i:<$i>, j:<$j>, k:<$k>"
}
四、循环控制:break与continue
Tcl提供两个循环控制命令,用于退出部分或全部循环,分别为continue和break。
五、eval命令
eval用于创建和运行Tcl脚本的通用构造块。eval的一个用途是生成命令,把它们存放在变量中,然后把这个变量作为Tcl脚本运行。
如
set reset {
set a 0
set b 0
set c 0
}
eval $reset
如果编写一个应用程序,其中的脚本是作为一个动态过程的结果产生的,那么eval就是运行该脚本的适当方法。
历史上eval最重要的用途曾是强制进行另一级的解析。如变量vars中包含了一个变量列表,希望删除列表中的变量。
set vars {a b c d}
foreach i $vars {
unset $i
}
上面的脚步能完成任务,但是unset命令可以接受任意多个参数,因此可以用一条命令删除所有变量。
set vars {a b c d}
eval unset $vars
set vars {a b c d}
unset {*}$vars
六、从文件运行:source
source命令读取一个文件,将其内容作为Tcl脚本运行。
使用source命令,可以将一个大的脚本分解为小的模块,由一个主脚本用source调用其他的脚本模块。