程序因为流程控制而拥有生命。
流程控制只有顺序执行,条件跳转,循环执行三种形式。而恰恰是这三种方式的组合构建出一个又一个精彩的程序。
所谓大道至简,诚如其言。
这没什么太多好说的,通常就是代码的书写顺序。
最常见的条件分支语句是if语句。另外一个是switch语句
if {$a > 10} { puts "I'm here" } elseif { puts "I'm in else" } switch $var { pattern_a {call_my_proc} pattern_b {puts "I'm here"} default {puts "No match! Use default!"} }
Tcl中的switch语句可以指定匹配方式(通配符、正则表达式、完全匹配)。
switch -exact $var
-glob
或者 -regexp
for {set i 0} {$i<10} {incr i} { puts "Loop $i" } while {$i<10} { puts "Loop $i" } foreach item $itemlist { puts "This is $item" }
while {$i<10} { if {$is_break} { break } else { continue } puts "haha" }
下面的语句有什么问题吗?
if { 5 > 4 } { # if {10 > 3} { puts "I am here" }
实际执行的话,可能会发现大括号不匹配的问题。问题就出在被注释掉的 if 语句那行。对Tcl来说,if 本质上是一条命令,所有后面的语句都只是参数,带有注释符号的那行只有在被执行时才会被认为是注释,在此之前,可以认为它只是字符串。而当作字符串来看的话,就确实有大括号不匹配的问题。
看下面的代码:
set i 0 while "$i < 3" { incr i puts $i }
如果你认为上面的循环会循环3遍的话,那就错了。事实上它会变成一个死循环(Infinite Loop)。
原因在于双引号中的字符串在传递给命令之前先进行变量替换。这样对于while语句来说,他看到的循环条件其实是 "0 < 3",也就是永远为真值。