Tcl/Tk Insight: 流程控制

风行水上 @ 2009-06-20 08:41:55
标签:
    «目录»

    程序因为流程控制而拥有生命。

    流程控制只有顺序执行,条件跳转,循环执行三种形式。而恰恰是这三种方式的组合构建出一个又一个精彩的程序。

    所谓大道至简,诚如其言。

    顺序执行

    这没什么太多好说的,通常就是代码的书写顺序。

    条件分支

    最常见的条件分支语句是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相当于 switch -exact $var
    • 也可以用 -glob 或者 -regexp

    循环执行

    • for : for 循环
    • while : while 循环
    • foreach : 用来遍历List,提供了一种方便强大的遍历方法。
    for {set i 0} {$i<10} {incr i} {
        puts "Loop $i"
    }
    
    while {$i<10} {
        puts "Loop $i"
    }
    
    foreach item $itemlist {
        puts "This is $item"
    }
    

    break 和 continue

    • 用来停止循环或者跳过当前循环
    while {$i<10} {
      if {$is_break} {
        break
      } else {
        continue 
      }
      puts "haha"
    }
    

    Tcl语法中的 Tricky Part

    括号配对

    下面的语句有什么问题吗?

    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",也就是永远为真值。

    标签:

      分享到:
      comments powered by Disqus

      21/24ms