Chinaunix首页 | 论坛 | 博客
  • 博客访问: 242274
  • 博文数量: 28
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 468
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-03 10:33
文章分类

全部博文(28)

文章存档

2011年(1)

2009年(14)

2008年(13)

我的朋友

分类:

2008-09-10 16:03:52

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 ...?

%eval set a 2 ;set b 4
4

 
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

 

阅读(5933) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~