TCL脚本语言语法变量表达式LIST控制流过程字符串操作语法脚本、命令和单词符号一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开。下面的两个脚本都是合法的:seta1setb2或seta1;setb2TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。语法置换变量置换变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中命令。置换命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。反斜杠置换反斜杠置换\用于在单词符号中插入诸如换行符、空格、[、$等被TCL解释器当作特殊符号对待的字符。语法双引号和花括号TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符及$和[]两种置换符会照常处理。在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊处理。语法注释TCL中的注释符是‘#’,‘#’和直到所在行结尾的所有字符都被TCL看作注释,TCL解释器对注释将不作任何处理。不过,要注意的是,‘#’必须出现在TCL解释器期望命令的第一个字符出现的地方,才被当作注释。变量简单变量一个TCL的简单变量包含两个部分:名字和值。名字和值都可以是任意字符串。不过为了更好的使用置换,变量名最好按C\C++语言中标识符的命名规则命名。TCL解释器在分析一个变量置换时,只把从$符号往后直到第一个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变量的名字。如果变量名中有不是字母、数字或下划线的字符,又要用置换,可以用花括号把变量名括起来。变量数组数组是一些元素的集合。在TCL中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中,数组元素的名字包含两部分:数组名和数组中元素的名字,TCL中数组元素的名字(下标〕可以为任何字符串。数组元素的置换,除了有括号之外,其置换和简单变量类似。变量相关命令set命令该命令能生成一个变量、也能读取或改变一个变量的值。unset命令该命令从解释器中删除变量,它后面可以有任意多个参数,每个参数是一个变量名,可以是简单变量,也可以是数组或数组元素。append命令该命令把文本加到一个变量的后面。Incr命令该命令把一个变量值加上一个整数。incr要求变量原来的值和新加的值都必须是整数。表达式TCL中的表达式类似于ANSIC的表达式。表达式由操作数和操作符构成。操作数TCL表达式的操作数通常是整数或实数。整数一般是十进制,但如果整数的第一个字符是0(zero),那么TCL将把这个整数看作八进制的,如果前两个字符是0x则这个整数被看作是十六进制的。TCL的实数的写法与ANSIC中完全一样。运算符与优先级TCL中用到的运算符,它们的语法形式和用法跟ANSIC中很相似,运算符优先级也与ANSIC规定类同。LISTlist这个概念在TCL中是用来表示集合的。TCL中list是由一堆元素组成的有序集合,list可以嵌套定义。list每个元素可以是任意字符串,也可以是list。下面都是TCL中的合法的list:{}//空list{abcd}{a{bc}d}//list可以嵌套list是TCL中比较重要的一种数据结构,对于编写复杂的脚本有很大的帮助。LISTList命令语法:list?valuevalue...?功能:这个命令生成一个list,list的元素就是所有的value。实例:%list12{34}12{34}LISTconcat命令语法:concatlist?list...?功能:这个命令把多个list合成一个list,每个list变成新list的一个元素。LISTlindex命令语法:lindexlistindex功能:返回list的第index个(0-based)元素。实例:%lindex{12{34}}234#注意没有{}LISTllength命令语法:llengthlist功能:返回list的元素个数。实例:%llength{12{34}}3LISTlinsert命令语法:linsertlistindexvalue?value...?功能:返回一个新串,新串是把所有的value参数值插入list的第index个(0-based)元素之前得到。实例:%linsert{12{34}}178{910}178{910}2{34}LISTlreplace命令语法:lreplacelistfirstlast?valuevalue...?功能:返回一个新串,新串是把list的第first(0-based)到第last个(0-based)元素用所有的value参数替换得到的。如果没有value参数,就表示删除第first到第last个元素。实例:%lreplace{178{910}2{34}}331782{34}%lreplace{1782{34}}444561782456LISTlrange命令语法:lrangelistfirstlast功能:返回list的第first(0-based)到第last(0-based)元素组成的串,如果last的值是end。就是从第first个直到串的最后。实例:%lrange{1782456}3end2456LISTlappend命令语法:lappendvarnamevalue?value...?功能:把每个value的值作为一个元素附加到变量varname后面,并返回变量的新值,如果varname不存在,就生成这个变量。实例:%lappenda123123LISTsplit命令语法:splitstring?splitChars?功能:把字符串string按分隔符splitChars(string中也用这个分割)分成一个个单词,返回由这些单词组成的串。如果splitChars是一个空字符{},string被按字符分开。如果splitChars没有给出,string原样输出。实例:%split“how.are.you.howareyou%splithowareyouhowareyou%splithowareyou{}how{}are{}youLISTjoin命令语法:joinlist?joinString?功能:join命令是命令的逆。这个命令把list的所有元素合并到一个字符串中,中间以joinString分开。缺省的joinString是空格。实例:%join{how{}are{}you}{}howareyou%join{howareyou}.how.are.you控制流If命令语法:iftest1body1?elseiftest2body2elseif...?elsebodyn?功能:TCL先把test1当作一个表达式求值,如果值非0,则把body1当作一个脚本执行并返回所得值,否则把test2当作一个表达式求值,如果值非0,则把body2当作一个脚本执行并返回所得值……实例:if{$x0}{.....}elseif{$x==1}{.....}elseif{$x==2}{....}else{.....}注意:1、上例中‘{’一定要写在上一行;2、if和{之间应该有一个空格。控制流循环命令while命令for命令foreach命令控制流while命令语法:whiletestbody功能:参数test是一个表达式,body是一个脚本,如果表达式的值非0,就运行脚本,直到表达式为0才停止循环,此时while命令中断并返回一个空字符串。实例:把a的值倒序复制到bseta1234setbseti[expr[llength$a]-1]while{$i=0}{lappendb[lindex$a$i]incri-1}控制流for命令语法:forinittestreinitbody功能:参数init是一个初始化脚本,第二个参数test是一个表达式,用来决定循环什么时候中断,第三个参数reinit是一个重新初始化的脚本,第四个参数body也是脚本,代表循环体。实例:把a的值倒序复制到bseta1234“setbfor{seti[expr[llength$a]-1]}{$i=0}{incri-1}{lappendb[lindex$a$i]}控制流foreach命令这个命令有两种语法形式语法形式1:foreachvarNamelistbody功能:第一个参数varName是一个变量,第二个参数list是一个表(有序集合),第三个参数body是循环体。每次取得链表list的一个元素,都会执行循环体一次。实例:把a的值倒序复制到bseta“1234setbforeachi$a{setb[linsert$b0$i]}控制流foreach命令语法形式2:foreachvarlist1list1?varlist2list2...?Body功能:这种形式包含了第一种形式。第一个参数varlist1是一个循环变量列表,第二个参数是一个列表。list1,varlist1中的变量会分别取list1中的值。body参数是循环体。?varlist2list2...?表示可以有多个变量列表和列表对出现。实例:setx{}foreach{ij}{abcdef}{lappendx$j$i}这时总共有三次循环,x的值为badcfe控制流break和continue命令在循环体中,可以用break和continue命令中断循环。其中break命令结束整个循环过程,并从循环中跳出,continue只是结束本次循环。控制流switch命令语法:switch?options?string{patternbody?Patternbody...?}功能:第一个是可选参数options,表示进行匹配的方式。第二个参数string是要被用来作测试的值,第三个参数是括起来的一个或多个元素对。实例:switch$x{a-b{incrt1}c{incrt2}default{incrt3}}控制流eval命令语法:evalarg?arg...?功能:该命令是一个用来构造和执行TCL脚本的命令。可以接收一个或多个参数,然后把所有的参数以空格隔开组合到一起成为一个脚本,然后对这个脚本进行求值。实例:%evalseta2;setb44控制流source命令语法:sourcepath功能:source命令读一个文件并把这个文件的内容作为一个脚本进行求值。实例:sourcee:/tcl&c/hello.tcl注意:路径的描述应该和UNIX相同,使用‘/’而不是'\'。过程TCL支持过程的定义和调用,在TCL中,过程可以看作是用TCL脚本实现的命令,效果与TCL的固有命令相似。我们可以在任何时候使用proc命令定义自己的过程,TCL中的过程类似于C中的函数。过程过程定义和返回值proc命令语法:procpronamevarlistbody功能:proc命令的第一个参数是你要定义的过程的名字,第二个参数是过程的参数列表,参数之间用空格隔开,第三个参数是一个TCL脚本,代表过程体。实例:%procadd{xy}{expr$x+$y}return命令在定义过程时,可以利用return命令在任何地方返回想要的值。Return命令迅速中断过程,并把它的参数作为过程的结果。过程局部变量和全局变量对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除,所以称为局部变量;在所有过程之外定义的变量我们称之为全局变量。TCL中,局部变量和全局变量可以同名,两者的作用域的交集为空:局部变量的作用域是它所在的过程的内部;全局变量的作用域则不包括所有过程的内部。这一点和C语言有很大的不同。global命令功能:使用该命令可以在过程内部引用一个全局变量的值实例:%seta44%procsample{x}{globalaincrareturn[expr$a+$x]#最基本的语法:命令