您当前的位置: 首页 > 

lu-ming.xyz

暂无认证

  • 0浏览

    0关注

    115博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Tcl学习笔记】第8章 流程控制

lu-ming.xyz 发布时间:2021-08-13 14:32:48 ,浏览量:0

目录
  • 8.1 if
  • 8.2 switch
  • 8.3 循环命令:while、for、foreach
  • 8.4 循环控制:break与continue
  • 8.5 eval 命令
  • 8.6 从文件运行

8.1 if

命令:if test1 body1 ?elseif test2 body2 elseif ...? ?else bodyn? 作用:将test作为表达式处理。如果为真,将body作为Tcl脚本处理,返回它的值。

  • 对if和其他控制结构获取的表达式和脚本所用的解析方法与对Tcl所有命令的所有参数所用解析方法相同,建议总是把表达式和脚本放在大括号中,这样再命令执行前不会有替换发生。
  • 注意换行符是命令分隔符,所以每个左大括号必须与它的前一个单词位于同一行。
  • 回顾大括号引用:如果一个单词以左大括号开头,那么直到与它匹配的右大括号为止,所有字符都将被原封不动地识别为这个单词的值。这个单词中不会发生任何替换,所有的而空格、制表符、换行符以及分号都作为普通字符处理。
if {test1} {
    body1
} elseif {test2} {
    body2
} ...    {...}   {
    ...
} else           { 
    bodyn
}
8.2 switch

命令:

  • 形式一:switch ?options? string {pattern body ?pattern body ...?}
  • 形式二:switch ?options? string pattern body ?pattern body ...?

作用:把string和各pattern进行匹配,知道找到一个匹配的pattern,然后执行它后面对应的body。返回执行改body的结果,如果没有匹配的pattern,则返回空字符串。options可以是-exact、-glob、-regexp或–(用来代表选项结束) 形式一:

switch $x {
    a {incr t1}
    b {incr t2}
    c {incr t3}
}

形式二:

switch $x \
    a {incr t1} \
    b {incr t2} \
    c {incr t3}

可见,形式一可以很方便的和对应的脚本写成多行格式。

switch的匹配模式:

  • -exact(默认):严格的字符串比较。
  • -glob:string match命令下的匹配。
  • -regexp:正则表达式匹配。
set t1 0 
set t2 0
set t3 0
foreach i $x {
    switch -regexp -- $i {
        a           {incr t1}
        ^[0-9]+$    {incr t2}
        default     {incr t3}
    }
}
  • 模式default可以与任意值匹配。
  • --来标记选项的结束,避免以-开头的检测值被误认为选项。
  • 如果某个模式的body与下一模式相同,可用-代替。
  • 注意注释不能加在大括号内。
8.3 循环命令:while、for、foreach

命令:while test body 作用:若表达式test的值为真,将body作为Tcl脚本运行。重复这个过程知道test为假。

命令:for init test reinit body 作用:将init作为一个脚本运行,然后将test作为一个表达式处理。如果test的值为真,将body作为Tcl脚本运行,然后将reinit作为Tcl脚本运行,然后将test作为表达式处理。重复这个过程直到test的值为假。

命令:

  • 形式一:foreach varName list body
  • 形式二:foreach varlist1 list1 ?varlist2 list2 ...? body 作用:把变量varName按顺序设置为list中的每一个元素,然后将body作为Tcl脚本运行。返回一个空字符串。list必须是有效的Tcl列表。
set b {}
set i [expr {[llength $a] - 1}]
while {$i >= 0} {
    lappend b {lindex $a $i}
    incr i -1
}
set b {}
for {set i [expr {[llength $a] - 1}]} {$i >= 0} {incr i -1} {
    lappend b {lindex $a $i}
}
set b {}
foreach i $a {
    set b [linsert $b 0 $i]
}
8.4 循环控制:break与continue
  • break命令引起最内层循环的命令立即终止循环。
  • continue命令只终止最内层循环的当前迭代步。
8.5 eval 命令
  • 用于创建和运行Tcl脚本的通用构造块,与matlab中eval命令功能一致。
set reset {
    set a 0
    set b 0
    set c 0
}
eval $reset
8.6 从文件运行

source命令读取一个文件,将其作为Tcl脚本运行。source获取一个参数,该参数指定要读取的文件名。

source init.tcl

source的返回值就是运行文件内容的返回值,即文件中命令最后一条命令的返回值。另外,source运行在文件中使用return命令终止进程。

关注
打赏
1655639048
查看更多评论
立即登录/注册

微信扫码登录

0.0421s