您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > tcl脚本语言中文详解
TCL用法祥述一TCL语法1脚本、命令和单词符号一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的:seta1setb2或seta1;setb2TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,TCL解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。2置换(substitution)注:在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。'//'后面是我自己加上的说明,不是例子的一部分。TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如:%setx10//定义变量x,并把x的值赋为1010%setyx+100//y的值是x+100,而不是我们期望的110x+100上例的第二个命令中,x被看作字符串x+100的一部分,如果我们想使用x的值'10',就必须告诉TCL解释器:我们在这里期望的是变量x的值,而非字符'x'。怎么告诉TCL解释器呢,这就要用到TCL语言中提供的置换功能。TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。1)变量置换(variablesubtitution)变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中。例如:%sety$x+100//y的值是10+100,这里x被置换成它的值1010+100这时,y的值还不是我们想要的值110,而是10+100,因为TCL解释器把10+100看成是一个字符串而不是表达式,y要想得到值110,还必须用命令置换,使得TCL会把10+100看成一个表达式并求值。2)命令置换(commandsubstitution)命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。例如:%sety[expr$x+100]110y的值是110,这里当TCL解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程,并把'expr'和变量置换后得到的'10+110'传递给该命令过程进行处理。如果在上例中我们去掉[],那么TCL会报错。因为在正常情况下,TCL解释器只把命令行中的第一个单词作为看作命令,其他的单词都作为普通字符串处理,看作是命令的参数。注意,[]中必须是一个合法的TCL脚本,长度不限。[]中脚本的值为最后一个命令的返回值,例如:%sety[expr$x+100;setb300]//y的值为300,因为setb300的返回值为300300有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参数。3)反斜杠置换(backslashsubstitution)TCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、[、$等被TCL解释器当作特殊符号对待的字符。例如:setmsgmultiple\space//msg的值为multiplespace。如果没有'\'的话,TCL会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于是发现set命令有多于两个参数,从而报错。加入了'\'后,空格不被当作分隔符,'multiplespace'被认为是一个单词(word)。又例如:%setmsgmoney\\$3333\\nArray\a\[2]//这个命令的执行结果为:money$3333Arraya[2]这里的$不再被当作变量置换符。TCL支持以下的反斜杠置换:BackslashSequenceReplacedBy\aAudiblealert(0x7)\bBackspace(0x8)\fFormfeed(0xc)\nNewline(0xa)\rCarriagereturn(0xd)\tTab(0x9)\vVerticaltab(0xb)\dddOctalvaluegivenbyddd(one,two,orthreed's)\xhhHexvaluegivenbyhh(anynumberofh's)\newlinespaceAsinglespacecharacter.例如:%seta\x48//对应\xhhH//十六进制的48正好是72,对应H%seta\110//对应\dddH//八进制的110正好是72,对应H%seta[expr\//对应\newlinespace,一个命令可以用\newline转到下一行继续2+3]54)双引号和花括号除了使用反斜杠外,TCL提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号和花括号({})。TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符及$和[]两种置换符会照常处理。例如:%setx100100%sety$xddd100ddd而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊处理。%sety{/n$x[expr10+100]}/n$x[expr10+100]3注释TCL中的注释符是'#','#'和直到所在行结尾的所有字符都被TCL看作注释,TCL解释器对注释将不作任何处理。不过,要注意的是,'#'必须出现在TCL解释器期望命令的第一个字符出现的地方,才被当作注释。例如:%#Thisisacomment%seta100#Notacommentwrong#args:shouldbesetvarName?newValue?%setb101;#thisisacomment101第二行中'#'就不被当作注释符,因为它出现在命令的中间,TCL解释器把它和后面的字符当作命令的参数处理,从而导致错误。而第四行的'#'就被作为注释,因为前一个命令已经用一个分号结束,TCL解释器期望下一个命令接着出现。现在在这个位置出现'#',随后的字符就被当作注释了。二变量1简单变量一个TCL的简单变量包含两个部分:名字和值。名字和值都可以是任意字符串。例如一个名为“13237&*:hdgg的变量在TCL中都是合法的。不过为了更好的使用置换(substitution),变量名最好按C\C++语言中标识符的命名规则命名。TCL解释器在分析一个变量置换时,只把从$符号往后直到第一个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变量的名字。例如:%seta22seta.144%setb$a.12.1在最后一个命令行,我们希望把变量a.1的值付给b,但是TCL解释器在分析时只把$符号之后直到第一个不是字母、数字或下划线的字符(这里是'.')之间的单词符号(这里是'a')当作要被置换的变量的名字,所以TCL解释器把a置换成2,然后把字符串“2.1”付给变量b。这显然与我们的初衷不同。当然,如果变量名中有不是字母、数字或下划线的字符,又要用置换,可以用花括号把变量名括起来。例如:%setb${a.1}4TCL中的set命令能生成一个变量、也能读取或改变一个变量的值。例如:%seta{kdfjkjdf}kdfjkjdf如果变量a还没有定义,这个命令将生成变量a,并将其值置为kdfjkjdf,若a已定义,就简单的把a的值置为kdfjkjdf。%setakdfjkjdf这个只有一个参数的set命令读取a的当前值kdfjkjdf。2数组数组是一些元素的集合。TCL的数组和普通计算机语言中的数组有很大的区别。在TCL中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中,数组元素的名字包含两部分:数组名和数组中元素的名字,TCL中数组元素的名字(下标〕可以为任何字符串。例如:setday(monday)1setday(tuesday)2第一个命令生成一个名为day的数组,同时在数组中生成一个名为monday的数组元素,并把值置为1,第二个命令生成一个名为tuesday的数组元素,并把值置为2。简单变量的置换已经在前一节讨论过,这里讲一下数组元素的置换。除了有括号之外,数组元素的置换和简单变量类似。例:setamondaysetday(monday)1setb$day(monday)//b的值为1,即day(monday)的值。setc$day($a)//c的值为1,即day(monday)的值。TCL不能支持复杂的数据类型,这是一个很大的缺憾,也是TCL受指责很多的方面。但是TCL的一个扩展ITCL填补了这个缺憾。3相关命令set这个命令在3.1已有详细介绍。■unset这个命令从解释器中删除变量,它后面可以有任意多个参数,每个参数是一个变量名,可以是简单变量,也可以是数组或数组元素。例如:%unsetabday(monday)上面的语句中删除了变量a、b和数组元素day(monday),但是数组day并没有删除,其他元素还存在,要删除整个数组,只需给出数组的名字。例如:%puts$day(monday)can'treadday(monday):nosuchelementinarray%puts$day(tuesday)2%unsetday%puts$day(tuesday)can'treadday(tuesday):nosuchvariable■append和incr这两个命令提供了改变变量的值的简单手段。append命令把文本加到一个变量的后面,例如:%settxthellohello%appendtxt!Howareyouhello!Howareyouincr命令把一个变量值加上一个整数。incr要求变量原来的值和新加的值都必须是整数。%setbaa%incrbexpectedintegerbutgota%setb22%incrb35三表达式1操作数TCL表达式的操作数通常是整数或实数。整数一般是十进制的,但如果整数的第一个字符是0(zero),那么TCL将把这个整数看作八进制的,如果前两个字符是0x则这个整数被看作是十六进制的。TCL的实数的写法与ANSIC中完全一样。如:2.17.9e+126e43.2运算符和优先级下面的表格中列出了TCL中用到的运算符,它们的语法形式和用法跟ANSIC中很相似。这里就不一一介绍。下表中的运算符是按优先级从高到低往下排列的。同一格中的运算符优先级相同。语法形式结果操作数类型-a!a~a负a非aint,floatint,floatinta*ba/ba%b乘除取模int,floatint,floatinta+ba-b加减int,floatint,floatabab左移位右移位intintababa=ba=b小于大于小于等于大于等于int,float,stringint,float,stringint,float,stringint,float,stringa==ba!=b等于不等于int,float,stringint,float,stringa&b位操作与inta^b位操作异或inta|b位操作或inta&&b逻辑与int,floata||b逻辑或int,floata?b:c选择运算a:int,float3数学函数TCL支持常用的数学函数,表达式中数学函数的写法类似于C\C++语言的写法,数学函数的参数可以是任意表达式,多个参数之间用逗号隔开。例如:%setx22%expr2*sin($x3)1.68294196962其中expr是TCL的一个命令,语法为:exprarg?arg...?两个?之间的参数表示可省,后面介绍命令时对于可省参数都使用这种表
本文标题:tcl脚本语言中文详解
链接地址:https://www.777doc.com/doc-4376560 .html