Tcl 流程控制

本文详细介绍了Tcl编程中的流程控制命令,包括if-elseif-else结构、switch命令的多种模式匹配、while、for和foreach循环,以及break和continue的使用,还有eval命令的通用构造块功能和source命令的文件包含功能。
摘要由CSDN通过智能技术生成

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调用其他的脚本模块。

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值