控制结构命令

Tcl 提供了 ifif/elseif/elseifforeachforwhile switch 命令来管理控制结构。这些命令和其他语言如C语言的条件语句的作用相同。需要区别的是在 Tcl 中所有控制结构都是由相应的命令来实现,而 C 语言中则是一条控制语句。 

控制结构通常要求带有一个延迟执行命令体或者过程体,这个命令体需要用花括号括起来以加以界定。 

1. if/else 命令

if 命令根据表达式的结果来执行命令体:如果表达式结果为真,则执行命令体,否则会执行另外一个条件命令体(如果存在的话)。后面两个命令体(elseif else)是可选的。

if {test expr 测试表达式} {

  body 1

} elseif {test expr} {

  body2

} else {test expr} {

  body3

}

注意

  • 语法中用以界定过程体的花括号一定要和 if 命令在同一行上!因为对 Tcl 来讲,换行符就是命令结束符,所以如果在 if 表达式后直接换行,写成: 

if {test expr}

{

  ...

}

就会出错。 Tcl 遇到换行后就认为命令结束,但找不到执行命令体,返回错误。其他的控制命令,还有以后的过程定义命令等等都存在这个问题。 

  • 如果 if 后面还有 else/elseif 命令,则要留意 else/elseif 的位置。 else/elseif 要跟在 if执行命令体的后面一个花括号后,不能分行,要有空格间隔花括号和 else /elseif 
  • 花括号括起的表达式、执行命令体或者其他内容相当于变量存在,所以前后与其他命令元素之前要有空格,否则 Tcl 会返回语法错误。 

示例:

  • set x hello

if {![string compare $x hell]} {

  puts "String is hell"

} elseif ![string compare $x hel] {

  puts "String is hel"

} elseif ![string compare $x hello] {

  puts "String is hello"

} else { puts "Error input string"}

    •  => String is hello

例子中 if 的表达式用花括号括了起来,而 elseif 的表达式却没有花括号,这两种表达方法都可以,但用花括号的时候条件命令语句执行得更有效率。 

2. for命令

for 命令的语法格式为: 

for {start} {test expr} {next} {

  body

}

for 命令有四个变元, start 是预置条件或者初始化命令,告诉 for 命令起始执行条件。 test expr 是条件布尔表达式,以决定是否执行循环体 body,如果是真,则执行循环体,如果假则退出命令。如果表达式真,则在执行循环体后处理 next 命令,即 next 是一个后置命令执行体。

前三个变元可以选择置空,而将相应的处理放到循环体 body 中去。 

for {set i 0} {$i < 10} {incr i 2} {

  if {$i == 4} {

    continue;

  }

  puts "i = $i"

  if ($i >= 6) {

    break;

  }

}

break 命令导致立刻从循环体内退出。而 continue i 值为 4 的时候忽略后面的循环体的内容而执行下一个循环。 

3. while命令

while 命令格式为:

while {test} {

  body

while 循环的例子:

set i 3

while {$i > 0} {

  puts "Current index is $i"

  incr i-1

}

4.  break continue 命令 

break 命令立即终止循环并退出循环体。而 continue 命令则会忽略后面的循环体内容而继续下一个循环处理过程。 Tcl 中没有 goto 命令。 

5.  switch 命令 

switch 命令通过将给定字符串与不同的匹配模式进行匹配从而选择执行多分支命令体。switch 可基于模式匹配。命令格式为:

switch [option] string {

  pattern-1 {body-1}

  pattern-2 {body-2}

  pattern-3 {body-3}

注意:

  • option 主要有:
    • -exact   用精确匹配(默认)
    • -flob     用glob格式行模式匹配
      -regexp      用正则表达式模式匹配
    • --       标记选项结束或说明不用选项
  • 如果项邻的两个或者多个 pattern-x 的执行命令体是一样的,则可以只写出最后的一个执行命令体,而前面的执行命令体可以省略,并用“ -”号来替代。 
  • 最后一个 option 一定是 “--",这个选项不可缺少! (标记option结束)
  • 对于 switch 执行命令体 内的注释一定要小心。 Tcl 语法器处理的注释应该和命令处于同一层次,即一个注释要占用一个命令的位置。这样就限制了在 switch 体内注释的位置。比如你不能将一条注释放在和 pattern-n 同一级别的位置,那样 switch 命令就会将此条注释也当成一个匹配模式来解释,这有可能引起意想不到的错误。所以,如果打算在switch 体内写注释的话,最好将注释放在相应的某个匹配模式的命令体 body-n 内。 

switch 命令的简单例子 :

  • set result TRUE

  • switch -exact -- $result {

  #Comment1:This comment will confuses switch command

  "TRUE" {

    #Comment2:This comment is ok

    puts "TRUE"

  }

  "FALSE" {

    puts "FALSE"

  }

  "UNKNOW"-

  default { puts "UNKNOW or unkown value"}

}

6. catch命令

在实际应用中,如果一条命令或函数在调用时使用了错误输入参数或者自身出现错误,它就会报错,而且终止当前脚本的执行。严重的错误也可能导致 Tcl shell 退出。 catch 命令就可以用来捕获这种调用错误。 

语法:

  • catch {com_proc} ?res?

catch 命令有两个变元, com_proc 是命令体。 res 用来保存命令返回结果,或是出错时的错误信息,此变元为可选项。如果有错, catch 会返回 1,无错就返回 0。命令体需要用花括号括起来。

示例:

  • set status [catch {puts "The value of y is $y"} res]

    •  => 1  #因为用了未定义的变量y出错

if {$status} {

  puts "Command faild. Error Info:$res"

}

    •  => Command faild. Error Info:$res

7. error命令

error 命令报告错误信息并终止脚本执行。 

语法:

  • error message_string ?info? ?error_code? 

message_string 是错误信息字符串, info 变元用于初始化全局变量 errorInfo,如果 info 没有提供,则 error 自身初始化 errorInfo。变元 code 指定了一个机器可读的错误信息,会被存储在全局变量 errorCode 中,默认为 NONE 

8. return 命令 

在一个过程中,可以使用 return 来返回调用。 return 的位置可以根据各种条件和需要进行安排,而且一个过程中可以包含多条 return 命令,但当遇到第一个可执行的 return 命令时就返回。

通常使用的 return 命令,或者不带变元,或者仅仅返回一个参数值。其实 return 命令的可选变元还有许多: 

  • retrun ?-code cd? ?-errorinfo info? ?-errorcode errc? str 

-code 的选项值是 okerrorreturnbreakcontinue,也可以是一个整数默认为 ok。

-code error 选项使 return 命令功能和 error 非常相似。此时-errorcode 选项设置全局变量errorCode,而-errorinfo 选项为 errorInfo 提供辅助信息。 

9. exit 命令 

exit 命令用来终止脚本的执行。 exit 会终止并退出整个运行脚本的进程(退出 Tcl shell),使用时要小心。如果在退时提供了一个整数数值,则它代表退出状态。 

posted @ 2024-04-14 18:43  小熊酱  阅读(3)  评论(0编辑  收藏  举报