TCL脚本语言学习(三)

流控制

1.if控制流


基本语法:
if { test expr 测试表达式 } {  

body 1

} elseif {test expr 测试表达式}  { 

  body2

} else {

test expr

}

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

if { test expr } 

{

  ...

}

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

但情况并不全部如此。当在一个花括号体内或者一个双引号体内换行的时候,解释器不认为是命令的结束,所以上面的语法中,我们只将执行命令体的第一个花括号(左括号)留在了 if 命令行和 else 命令行,然后另起一行书写执行命令体的过程语句,右括号也被单独放到了一行上。这样做是为了提高可读性和便于查错。

2)如果 if 后面还有 else/elseif 命令,则要留意 else/elseif 的位置。else/elseif 要跟在 if 执行命令体的后面一个花括号后,不能分行,要有空格间隔花括号和 else /elseif。

3)花括号括起的表达式、执行命令体或者其他内容相当于变量存在,所以前后与其他命令元素之前要有空格,否则 Tcl 会返回语法错误。

4)可以使用多个 elseif 来创建一连串的条件命令控制结构。

5)表达式支持变量替换和命令替换。

6)表达式的计算结果如果是”true”、”yes”和非零值就判断为真,如果结果是”false”、”no”和零则判断为假。控制命令根据表达式结果来判断是否执行相应的执行命令体。

#要求根据学生的score判断学生的成绩等级,如果大于90则打印出的等级为A,并显示其成绩
#如果80则B,其他为C 并显示具体成绩
puts "请输入学生的成绩:"
set score [gets stdin]
if {$score>=90} {
    puts "分数是$score,等级为A"
} elseif {$score>=80} {
    puts "分数是$score,等级为B"    
} else {
    puts "分数是$score,等级为C"    
}

2. switch 命令

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

switch 可基于模式匹配。命令格式为:

switch [option] string {

  pattern-1 {body1}  

  pattern-2 {body2}                        

  pattern-n {bodyn}
                        } 

说明:

1.option 主要有:

-exact  用精确匹配(默认);

-glob  用 glob 格式行模式匹配;

-regexp   用 正则表达式模式匹配;

--  标记选项结束或者说明不用选项。

set result tru
switch $result {
    true {puts true}
    false {puts false}
    default {puts unknow}
}

循环

tcl提供三种循环命令,分别为:for,while,foreach。此外tcl还提供两个循环控制命令。注意:这个三个命令中的程序块的开始花括号必须要和三个命令同一行。

1.for 命令

for 命令和 C 语言的 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} {puts $i;} #将打印出0到9

2. while 命令

while 命令格式为:

while {test } {
         body
               } 

while 命令和 for 命令非常相似。只要 test 为真,while 就执行循环体直到 tes变为假。for

命令和 while 命令的主要区别是,在 while 循环体内你必须更改被检测的测试体 test 的值,否则如果值一直没有改变成假时,while 将无限的执行循环体。而 for 命令你可以将这种处理过程在 next 变元中显式给出。

set i 3 
while {$i > 0} {
puts "Current index is $i." 
            incr i –1 
} 
=>    Current index is 3. 
Current index is 2. 
Current index is 1.

3.foreach

       foreach - 反复循环操作一个或多个列表的每个元素

       foreach命令执行一个循环,循环的变量是一个或多个列表的元素。最简单的情况下是一个循环变量varname和一个列表listlist中的值一次分配给varnamebody变元是一个Tcl脚本,对于每个list中的元素(顺序是由第一个到最后一个),foreach分配元素的内容给varname,然后调用Tcl解释器去执行body

        一般情况下可以有多个列表,并且每个列表可以是循环的变量,在每次循环中每个varlist变量被分配给相应的listforeach将一直循环执行所有列表中的值,如果在循环中其中一个列表的元素全部使用了,那么在后面的循环中这个列表的元素就用空字符串来代替。                      

     语法(1)foreach varname list body

              (2)foreach varlist1 list1 ?varlist2 list2 ...body

  举例:

set numbers {1 2 3 4 5}
set values {a b c d e f g h}
foreach {i j k} $values {
	puts "$i--$j--$k"
}
foreach number $numbers {i j} $values {
	puts "$number--$i--$j"
}

结果:

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值