本文转载自: FPGA打工人微信公众号
注:本文由作者授权转发,如需转载请联系作者本人
TCL语法中的控制流
tcl中的控制和C语言差距不大,包括if、while、for、foreach、switch、break、continue等。
if命令:
if { $x>0 } {
.....
} elseif { $x==1 } {
.....
} elseif { $x==2 } {
....
} else {
.....
}
注意:上例中的'{'一定要要和if、elseif、else写在同一行,并且彼此之间应该有一个空格,不然tcl会把'if{'当作一个整体而报错。该注意点也同样适用于下面几个命令。
while命令:这个和C语言没太大区别。
for命令:
for init test reinitbody
参数init是一个初始化脚本,参数test是一个表达式,用来决定for循环什么时候中断,参数reinit是一个重新初始化的脚本,参数body就是for循环中执行循环体。比如:
for {set i 0} {$i<10} {incr i} {
puts "the I is: $i "
}
foreach命令:这个命令有两种使用方式。
方式一:
foreach varName list body
除去列表list和循环体body外,varName是一个变量。比如:
set get_data 0
foreach num {1 2 3 4 5}{
set get_data [expr $get_data+$num]
}
puts “The get_data is :$get_data”
方式二:
foreachvarlist1 list1 ?varlist2 list2 ...? Body
这个继承了方式一,可以同时循环多个列表,最大迭代次数是为list的最大元素,如果list的value已经分配结束,但循环还在继续,就会分配空字符。比如:
set values {a b c d e f g h}
set numbers {1 2 3 4 5}
foreach number $numbers value $values {
puts "number:$number->value:$value"
}
最后得到的结果是:
number:1->value:a
number:2->value:b
number:3->value:c
number:4->value:d
number:5->value:e
number:->value:f
number:->value:g
number:->value:h
当然,也可以设置变量list,比如:
set values {a b c d e f g h}
foreach {i j k} $values {
puts "$i--$j--$k"
}
得到的结果为:
a--b--c
d--e--f
g--h—
break和continue命令
break是结束整个循环过程,continue是只结束本次循环。
switch命令:
switch ? options? string {pattern body ? pattern body ...?}
options是可选参数,和前面提到的lsearch命令一致.
eval命令:用来构造和执行tcl脚本的命令,比如:
set a 1
set b 2
set cmd “expr $a+$b”
eval $cmd
source命令:这个比较简单,运行tcl脚本命令,但需要注意的是,脚本路径的描述用’/’而不是‘\’
TCL语法中的过程
tcl中的过程作用类似于C语言中的函数,是通过proc命令生成的,比如:
proc add {x y } {expr $x+$y}
add 105
当然,也支持return返回,比如:
proc add {x y } {
set z [expr$x+$y]
return$z
}
set num [add 10 5]
tcl和c语言一样,也有局部变量和全局变量的概念,但有一点不同,tcl中的局部变量和全局变量可以同名,局部变量的作用域是它所在的过程中的内部;全局变量则不包括所有过程的内部。如果想在过程中引用全局变量,可以使用global命令,比如:
set a 4
proc sample { x } {
global a
incr a
return [expr $a+$x]
}
sample 3
最后得到的结果为 8
当然,也支持缺省参数,比如:
proc add {} {
expr 2+3
}
upvar命令:
upvar?level? otherVar myVar ?otherVar myVar ...?
该命令使得用户可以在过程中对全局变量或其他过程的局部变量进行访问,可以理解为绑定变量。otherVar是以引用方式访问的参数的名字,myVar是该过程中局部变量的名字,对myVar的读写,实际上就是对otherVar的读写。比如:
set a 1
proc test {b} {
upvar $b mya
puts $b
puts $mya
}
test a
最后得到的结果是:
a
1
而level代表的是作用域,这个默认状态是1,代表调用过程的作用域,为2时为上一层作用域,为#0时,表示全局作用域,此时的作用同global命令。