TCL: 变量、表达式、控制流、过程操作笔记
TCL提供了三种形式的置换:变量置换、命令置换和反斜杠置换。
%set x 10 10 %set y x+100 x+100 %set y $x+100 //变量置换 10+100 %set y [expr $x+100] //命令置换 110 %set y [expr $x+100;set b 300] 300 %set msg multiple\ space multiple space %set msg money\ \$3333\ \nArray\ a\[2] money $3333 Array a[2]
|
TCL支持以下的反斜杠置换:
\a 报警声 (0x7)
\b 回退 (0x8)
\f 换页 (0xc)
\n 换行 (0xa)
\r 回车 (0xd)
\t Tab (0x9)
\v Vertical tab (0xb)
\ddd ddd表示的八进制值
\xhh hh表示的十六进制值
\ 换行继续
%set a \x48 H //十六进制的48是72,对应H %set a \110 H //八进制的110是72,对应H %set a [expr \ 2+3] 5
|
%set y "$x ddd" 100 ddd //双引号中的各种分隔符不会被处理,换行符及$和[]两种置换符会被照常处理。 %set y {/n$x [expr 10+100]} /n$x [expr 10+100] //在花括号中,所有特殊字符都将成为普通字符 %set b 101 ; # 一个合法的注释 101
|
变量
简单变量
% set a 2 2 set a.1 4 4 % set b $a.1 2.1 %set b ${a.1} 4 %set a {kdfj kjdf} kdfj kjdf %set a kdfj kjdf
|
数组
%set a monday monday %set day(monday) 1 1 %set b $day(monday) 1 %set c $day($a) 1
|
set/unset命令:
语法:set varName ?newValue?
unset varName ?varName...?
append命令:
语法:append varName ?value value ...?
incr命令:
语法:incr varName ?increment?
表达式
运算符(按优先级从高到低往下排列)
-a; !a; ~a; a*b; a/b; a%b; a+b; a-b; a<>b; ab; a<=b; a>=b; a==b;
a!=b; a&b; a^b; a|b; a&&b; a||b; a?b:c
数学函数:
abs( x); acos( x); asin( x); atan( x); atan2( x, y); ceil( x); cos( x); cosh( x)
double( i); exp( x); floor( x); fmod( x, y); hypot( x, y); int( x); log( x)
log10( x); pow( x, y); round( x); sin( x); sinh( x); sqrt( x); tan( x); tanh( x)
expr命令:
语法:expr arg ?arg ...?
%expr 2*sin($x<3) 1.68294196962
|
控制流
控制流,包括if、while、for、foreach、switch、break、continue等命令。
if命令:
语法: if test1 body1 ?elseif test2 body2 elseif.... ? ?else bodyn?
if { $x>0 } { ..... } elseif { $x==1 } { ..... } elseif { $x==2 } { .... } else { ..... }
|
注意:{要写在上一行,注意if和{,}和{等之间的空格。
while命令:
语法:while test body
set a {a b c d e f g} set b " " set i [expr [llength $a]-1] while { $i>=0} { lappend b [lindex $a $i] incr i -1 }
|
for命令:
语法:for init test reinit body
set a {a b c d e f g} set b " " for {set i [expr [llength $a]-1]} {$i>=0} {incr i -1} { lappend b [lindex $a $i] }
|
foreach命令:
语法1:foreach varName list body
set a {a b c d e f g} set b " " foreach i $a { set b [linsert $b 0 $i] }
|
语法2:foreach varlist1 list1 ?varlist2 list2 ...? Body
set x {} foreach i {a b c} j {d e f g} { lappend x $i $j } //这时总共有四次循环,x的值为"a d b e c f {} g"
set x {} foreach i {a b c} {j k} {d e f g} { lappend x $i $j $k } //这时总共有三次循环,x的值为"a d e b f g c {} {}"
|
break和continue命令:
switch 命令:
语法:switch ?-exact? ?-glob? ?-regexp? string { pattern body ? pattern body ...?}
switch $x { a - b {incr t1} c {incr t2} default {incr t3} }
|
eval命令:(用来构造和执行TCL脚本)
语法:eval arg ?arg ...?
source命令:
过程
过程定义和返回值:
TCL中的过程是由proc命令产生的。
% proc add {x y } {expr $x+$y} % add 1 2 3
% proc abs {x} { if {$x >= 0} { return $x } return [expr -$x] }
|
局部变量和全局变量:
局部变量 - 在过程中定义的变量,只能在过程中被访问,并且当过程退出时会被自动删除。
全局变量 - 在所有过程之外定义的变量。
TCL中,局部变量和全局变量可以同名,两者的作用域的交集为空;局部变量的作用域是它所在的过程的内部,全局变量的作用域则不包括所有过程的内部。
使用global命令,在过程内部引用一个全局变量的值。
% set a 4 4 % proc sample { x } { global a incr a return [expr $a+$x] } % sample 3 8 %set a 5
|
缺省参数和可变个数参数:
%proc add {} { expr 2+3} //无参 %proc add {val1 {val2 2} {val3 3}}{ //缺省参数 expr $val1+$val2+$val3 } %proc add { val1 args } { //可变参数 set sum $val1 foreach i $args { incr sum $i } return $sum }
|
引用:upvar
语法: upvar ?level? otherVar myVar ?otherVar myVar ...?
% proc temp { arg } { upvar $arg b //$arg与b进行绑定 set b [expr $b+2] } % proc myexp { var } { set a 4 temp a return [expr $var+$a] }
% myexp 7 13
|
阅读(6012) | 评论(0) | 转发(0) |