| |
If {$x<0} {
...} elseif {$x==0} {
....
} else {
}
2.switch
格式
switch $x a {incr t1} b {incr t2} c {incr t3}
Switch $x {
A {incr t1}
B {incr t2}
C {incr t3}
}
Switch $x \
A {incr t1} \
B {incr t2} \
C {incr t3}
% proc sw {x} {
> switch $x {
> 1 {puts "111"}
> 2 {puts "222"}
> }
> }
% sw 1
111
%
Switch 支持3中模式匹配
-exact 表示严格的字符串比较
-glob 表示string match 命令下的匹配
-regexp 正则表达式
对于正则表达式匹配,还可以指定-matchvar参数,在它后面跟一个变量名。Switch名利会在这个变量中存入一个列表,第一个元素是与这个正则表达式匹配的字符串,的哥是首个捕获的子模式字符,一次类推。
-indexvar
这个索引变量会接收到有关字符索引的一个列表、
如果switch的命令的某个脚本是-,那么switch会使用下一个模式对应的脚本。
% switch 1 {
> 1 -
> 2 -
> 3 {puts "123"}
> 4 {puts "44"}
> }
123
Switch的注释只能加在脚本部分,如
3 {
#.........
}
3.while,for,foreach
% set i 3
3
% while {$i>=0} {
> lappend a $i
> incr i -1
> }
% set a
3 2 1 0
For 与while等价
For {set i 0} {$i<10} {incr i} {
}
% set b {}
% foreach i {1 2 3} {
set b [linsert $b 0 $i]
}
% set b
3 2 1
%
Foreach 还可以接受变量列表,当剩下的元素少于变量名列表中变量的个数,没有对应元素的变量就设为空字符串。
% foreach {x y} {a b c d e} {
> puts "<$x><$y>"
> }
<a><b>
<c><d>
<e><>
4.break,continue
Break让引起最内层循环的命令立即终止循环
Continue只终止最内层循环的当前迭代
% set b {}
if {$i==2} break
set b [linsert $b 0 $i]
}
% set b
1
% set b {}
% foreach i {1 2 3} {
if {$i==2} continue
set b [linsert $b 0 $i]
}
% set b
3 1
5.Eval
eval用于创建和运行tcl脚本的通用构造快。它接受任意多个参数,把他们用分割符串联起来,然后把串接的结果作为一个tcl脚本处理。
Eval的一个用途是生成命令
% set reset {
> set a 0
> set b 0
> set c 0
> }
set a 0
set b 0
set c 0
% eval $reset
0
% set a
0
% set d
can't read "d": no such variable
历史上eval最重要的用途曾经是强制进行另一极的解析。
% set var {a b c}
a b c
% eval $reset
0
% set a
0
% unset $var
can't unset "a b c": no such variable
% set a