




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Tcl编程简介(一)简介Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。是toolcommandlanguage的缩写,发音为"tickle”,实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用
2、户接口的一个输入中读取(按钮或菜单等)。但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。下面简单介绍以下tcl的语法规则:解释器在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。每一个Tcl命令是在特定的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_InterpTcl_Interp是一个轻量级的结构,可以快速的新建和删除。数据类型Tcl只支持一种数据结构:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点,所有的东西都是字符串。这是它比较
3、有特点的方面字符串有三种形式:命令(command),表达式(expresion)和表(list)。BasicCommandSyntax基本语法Tcl有类似于shell和lisp的语法,当然也有许多的不同。一条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。例如:seta22/相当于C中的a=22a是一个变量这条命令分为三个域:1set2a322set使用于设置变量的值的命令,a、20作为参数来传给它,a使它要操作白变量名,22是要付给的a值。Tcl的命令名可以是内置的命
4、令也可以是用户建的新命令,如果是用户用户建的新命令应用程序中用函数Tcl_CreateCommand来创建。所有的参数作为字符用来传递,命令自己会按其所需来解释的参数的。命令的名字必须被打全,但Tcl解释器找不到一同名的命令时会用unknown命令来代替。在很多场合下,unknown会在库目录中搜寻,找到一个的话,会自动生成一个Tcl命令并调用它。unknown经常完成缩略的命令名的执行。但最好不要使用。注释和shell很象,第一个字母是"#"的Tcl字符串是注释。其他细节规则Groupingargumentswithdouble-quotes用双弓I号来集群参数,目的在于
5、使用有空白的参数。例如:seta"thisstringcontainswhitespace"如够一个参数一双引号来开始,该参数会一直到下一个双引号才结束。其中可以有换行符和分号。Variablesubstitutionwith$用美元符进行变量替换说白了就是引用该变量。如:setahello实际上传给set命令的参数setb$a/b="hello"/是b,"hello"setca/b="a"Commandsubstitutionwithbrackets命令子替换(用方括号)例如:setasetb"hell
6、o"实现执行setb"hello"并用其结果来替换源命令中的方括号部分,产生一条新命令seta"hello"/"hello"为setb"hello"的返回值最终的结果是b="hello"a="hello"当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分都被视为Tcl命令。如下一个复杂一点的例子:setaxyzsetb"abc".setc"def&quo
7、t;/returnxyzabcdefBackslashsubstitution转移符替换转移符时间不可打印字符或由它数意义的字符插入进来。这一概念与C语言中的一样。Backspace(0x8).fFormfeed(0xc).Newline(0xa).Carriage-return(0xd).Tab(0x9).vVerticaltab(0xb).Leftbrace('").Rightbrace('").Openbracket('").Closebracket('").$Dollarsign('$").spS
8、pace('"):doesnotterminateargument.;Semicolon:doesnotterminatecommand."Double-quote.Groupingargumentswithbraces用花扩括号来集群参数用花扩括号来集群参数与用双引号来集群参数的区别在于:用花扩括号来集群参数其中的三种上述的子替换不被执行。而且可以嵌套。例如:setaxyzabcd/set收到俩个参数a"xyzabcd"evalseta22setb33/eval收到一个参数"seta22setb33"命令综述1 .一个命令就
9、是一个字符串(string)。2 .命令是用换行符或分号来分隔的。3 .一个命令由许多的域组成。第一个于是命令名,其它的域作为参数来传递。4 .域通常是有空白(Tab横向制表健Space空格)来分开的。5 .双引号可以使一个参数包括换行符或分号。三种子替换仍然发生。6 .花括号类似于双引号,只是不进行三总体换。7 .系统只进行一层子替换,机制替换的结果不会再去做子替换。而且子替换可以在任何一个域进行。8 .如果第一个非控字符是'#",这一行的所有东西都是注释。表达式对字符串的一种解释是表达式。几个命令将其参数按表达式处理,如:expr、for和if,并调用Tcl表达式处理器(
10、Tcl_ExprLong,Tcl_ExprBoolean等)来处理它们。其中的运算符号C语言的很相似。逻辑非*/%+-<<>>左移右移只能用于整数。<><=>=!=逻辑比较位运算和异或或&&逻辑"和""或"If-then-else与C的一样Tcl中的逻辑真为1,逻辑假为00一些例子:5/4.05/(stringlength"abcd"+0.0)计算字符串的长度转化为浮点数来计算"0x03">"2""0y"&
11、lt;"0x12"都返回1seta1expr$a+2expr1+2都返回3TCL语言Tcl(最早称为工具命令语言"叮oolCommandLanguage",但是目前已经不是这个含义,不过我们仍然称呼它为TCL)是一种脚本语言。由JohnOusterhout创建。TCL很好学,功能很强大。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。TCL念作踢叩”"tickle".Tcl的特性包括:# 任何东西都是一条命令,包括语法结构(for,if等)。# 任何事物都可以重新定义和重载。# 所有的数据类型都可以看作字符串。# 语法规则
12、相当简单# 提供事件驱动给Socket和文件。基于时间或者用户定义的事件也可以。# 动态的域定义。# 很容易用C,C+,或者Java扩展。# 解释语言,代码能够动态的改变。# 完全的Unicode支持。# 平台无关。Win32,UNIX,Mac上都可以跑。# 和Windows的GUI紧密集成。Tk# 代码紧凑,易于维护。TCL本身不提供面向对象的支持。但是语言本身很容易扩展到支持面向对象。许多C语言扩展都提供面向对象能力,包括XOTcl,IncrTcl等。另外SNIT扩展本身就是用TCL写的。使用最广泛的TCL扩展是TKoTK提供了各种OS平台下的图形用户界面GUI。连强大的Python语言都
13、不单独提供自己的GUI,而是提供接口适配到TK上。另一个流行的扩展包是Expect.Expect提供了通过终端自动执行命令的能力,例如(passwd,ftp,telnet等命令驱动的外壳).下面是TCL程序的例子:#!/bin/sh# nextlinerestartsusingtclshinpathexectclsh$1+"$"# echoserverthatcanhandlemultiple# cnewConnectionsockaddrport# clientconnectionswillbehandledin# l
14、ine-buffered,non-blockingmodefconfigure$sock-blockingno-bufferingline# callhandleDatawhensocketisreadablefileevent$sockreadablelisthandleData$sockprochandleDataputs$sockgets$sockifeof$sockclose$sock# handleallconnectionstoportgiven# asargumentwhenserverwasinvoked# bycallingnewConnectionsetportlindex
15、$argv0socket-servernewConnection$port# entertheeventloopbywaiting# onadummyvariablethatisotherwise# unused.vwaitforever另外一个TK的例子(来自AsimpleA/Dclock)它使用了定时器时间,3行就显示了一个时钟。proceverymsbodyeval$body;after$msinfolevel0packlabel.clock-textvartimeevery1000set:timeclockformatclocksec-format%H:%M:%S;#RS解释:第一行定
16、义了过程every,每隔ms毫秒,就重新执行body代码。第二行创建了标签起内容由time变量决定。第3行中设置定时器,time变量从当前时间中每秒更新一次。Tcl被广泛的用做script语言,大多数情况下,Tcl和Tk("ToolKit库嗣时使用,Tk是一系列令Tcl易于编写图形用户接口的命令和过程Tcl的一个重要特性是它的扩展性。如果一个程序需要使用某些标准Tcl没有提供的功能,可以使用c语言创造一些新的Tcl命令,并很容易的融合进去。正是由于Tcl易于扩展,很多人为它编写了扩展包,并在网上共享。Tcl和其他编程语言例如c不同,它是一种解释语言而非编译语言。Tcl程序由一'
17、;系列Tcl命令组成,在运行时由Tcl解释器解释运行。解释运行的一个优点是它可以自己为自己生成Tclscript。变量和变量交换不像c,Tcl的变量在使用前不需要声明。Tcl的变量在它首次被赋值时产生,使用set命令。变量可以用unset命令删除,虽然并不强制需要这样做。变量的值通过$符号访问,也叫变量交换。Tcl是一个典型的”弱类型定义”语言,这意味者任何类型可以存储在任何变量中。例如,同一个变量可以存储数字,日期,字符串甚至另一段Tclscript.Example1.1:setfoo"john"puts”Himynameis$foo"Output:Himyna
18、meisjohnExample1.2:setmonth2setday3setyear97setdate"$month:$day:$year"puts$dateOutput:2:3:97Example1.3:setfoo"putshi"eval$fooOutput:hi在这个例子里,变量foo存储了另外一段Tclscript.表达式包括数学表达式,关系表达式,通常用expr命令。Example2.1:expr0=1Output:0Example2.2:expr1=1Output:1两数比较,true则输出1,false输出0Example2.3:expr4
19、+5Output:9Example2.4:exprsin(2)Output:0.909297命令传递以运算结果替代Tcl命令中的部分Example 3.1:puts"Iamexpr10*2yearsold,andmyI.Q.isexpr100-25”Output:Iam20yearsold,andmyI.Q.is75方括号是命令传递的标志Example 3.2: setmy_height6.0puts"IfIwas2inchestaller,Iwouldbeexpr$my_height+(2.0/12.0)feettall"Output:IfIwas2inches
20、taller,Iwouldbe6.16667feettall命令流控制Tcl有判断流转(if-else;switch)和循环控制(while;for;foreach)Example4.1:setmy_planet"earth"if$my_planet="earth"puts"Ifeelrightathome."elseif$my_planet="venus"puts"Thisisnotmyhome."elseputs"IamneitherfromEarth,norfromVenus.&
21、quot;settemp95if$temp<80puts"It'salittlechilly."elseputs"Warmenoughforme."Output:Ifeelrightathome.Warmenoughforme.Example 4.2: setnum_legs4switch$num_legs2puts"Itcouldbeahuman."4puts"Itcouldbeacow."6puts"Itcouldbeanant."8puts"Itcouldbeasp
22、ider."defaultputs"Itcouldbeanything."Output:Itcouldbeacow.Example 4.3:forseti0$i<10inc门1puts"Intheforloop,andi=$i"Output:Intheforloop,andi=0Intheforloop,andi=1Intheforloop,andi=2Intheforloop,andi=3Intheforloop,andi=4Intheforloop,andi=5Intheforloop,andi=6Intheforloop,andi=
23、7Intheforloop,andi=8Intheforloop,andi=9Example 4.4: seti0while$i<10puts"Inthewhileloop,andi=$i"incri1Output:Inthewhileloop,andi=0Inthewhileloop,andi=1Inthewhileloop,andi=2Inthewhileloop,andi=3Inthewhileloop,andi=4Inthewhileloop,andi=5Inthewhileloop,andi=6Inthewhileloop,andi=7Inthewhilel
24、oop,andi=8Inthewhileloop,andi=9Example4.5:foreachvowelaeiouputs"$vowelisavowel"Output:aisavoweleisavoweliisavoweloisavoweluisavowelProceduresTcl的Procedures和c的函数差不多.它们有参数,它们返回值。基本定义方法是:procnameargListbody当一个procedure被定义,它就被看做是一个命令,如同Tcl的自带命令一样,通过名字来呼叫,名字后面跟上参数。缺省的,procedure的返回值是它的最后一个命令结果。但
25、也可以通过return命令来返回其他值。Return值可以在procedure的任何地方,一旦执行,procedure就此返回Example 5.1: procsum_procabreturnexpr$a+$bprocmagnitudeif$num>0return$numsetnumexpr$num*(-1)return$numsetnuml12setnum214setsumsum_proc$num1$num2puts"Thesumis$sum"puts"Themagnitudeof3ismagnitude3”puts"Themagnitudeof
26、-2ismagnitude-2”Output:Thesumis26Themagnitudeof3is3Themagnitudeof-2is2在procedure中可以通过set创造变量,但是变量只在procedure中有效,而且一旦procedure返回,这些变量就不可访问。如果procedure需要访问主程序中的变量,就需要使用global关键字。Example 5.2:procdumb_proc。setmyvar4puts"Thevalueofthelocalvariableis$myvar"globalmyglobalvarputs"Thevalueofth
27、eglobalvariableis$myglobalvar"setmyglobalvar79dumb_procOutput:Thevalueofthelocalvariableis4Thevalueoftheglobalvariableis79ListsLists就好像是Tcl中的一种特殊的数组。它把一堆东西放成一个集合,然后就像操作一个整体一样的操作它。Example 6.1:setsimple_list"JohnJoeMarySusan"putslindex$simple_list0putslindex$simple_list2Output:JohnMary注
28、意list的index是从0开始的Example 6.2:setsimple_list2"MikeSamHeatherJennifer"setcompound_listlist$simple_list$simple_list2puts$compound_listputsllength$compound_listOutput:JohnJoeMarySusanMikeSamHeatherJennifer2Example 6.3:setmylist"MercuryVenusMars"puts$mylistsetmylistlinsert$mylist2Eart
29、hputs$mylistlappendmylistJupiterputs$mylistOutput:MercuryVenusMarsMercuryVenusEarthMarsMercuryVenusEarthMarsJupiterArraysTcl数组在使用前无须定义,大小也不用指定。Example 7.1:setmyarray(0)"Zero"setmyarray(1)"One"setmyarray(2)"Two"forseti0$i<3inc门1puts$myarray($i)Output:ZeroOneTwoExample
30、 7.2:setperson_info(name)"FredSmith"setperson_info(age)"25"setperson_info(occupation)"Plumber"foreachthingnameageoccupationputs"$thing=$person_info($thing)"Output:name=FredSmithage=25occupation=Plumber这个例子指出数组的index不需要是数字,其他类型的数据也可以。Example 7.3:setperson_info(
31、name)"FredSmith"setperson_info(age)"25"setperson_info(occupation)"Plumber"foreachthingarraynamesperson_infoputs"$thing=$person_info($thing)”Output:occupation=Plumberage=25name=FredSmithStrings字符串是Tcl中最常用的类型,string有很多使用参数,可以参照Tcl手册。使用方法:stringoptionargarg.Example8.1
32、:setstr"Thisisastring"puts"Thestringis:$str"puts"Thelengthofthestringis:stringlength$str"puts"Thecharacteratindex3is:stringindex$str3"puts"Thecharactersfromindex4through8are:stringrange$str48"puts"Theindexofthefirstoccurrenceofletter"i"
33、;is:stringfirsti$str"Output:Thestringis:ThisisastringThelengthofthestringis:16Thecharacteratindex3is:sThecharactersfromindex4through8are:isaTheindexofthefirstoccurrenceofletter"i"is:2Input/OutputTcl的绝大多数输入/输出是通过puts和gets做到的。Puts命令显示在console上,gets命令从console输入上取得数据,并存储在某个变量中。getschannel
34、ldvarNamechannellD可以理解为c的文件句柄,varName如果定义,输入值就赋给它,gets返回读入的字节数,否则gets直接返回输入值。Example 9.1:puts-nonewline"Enteryourname:"setbytesreadgetsstdinnameputs"Yournameis$name,anditis$bytesreadbyteslong"Output:(notethatuserinputisshowninitalics)Enteryourname:ShyamYournameisShyam,anditis5byt
35、eslongExample 9.2:setfopen"/tmp/myfile""w"puts$f"WeliveinTexas.It'salready110degreesouthere."puts$f"456"close$fOutput:(none)Open打开了一个"/tmp/myfile"作为channel.用法是:opennameaccessaccess参数指出打开文件的方式,”w是读写。这时可以用puts$f把内容写入文件Example 9.3:setfopen"/tmp
36、/myfile""r"setline1gets$fsetlen_line2gets$fline2close$fputs"line1:$line1"puts"line2:$line2"puts"Lengthofline2:$len_line2"Output:line1:WeliveinTexas.It'salready110degreesouthere.line2:456Lengthofline2:3这个例子假设已知文件只有两行,如果不是,则需要使用循环,用eof来找到文件尾。evaleval命令会
37、把它的参数直接送往解释器。Example 10.1: setfoo"seta22"eval$fooputs$aOutput:22单纯的执行$foo不会成功。catchExample 10.2:setretvalcatchsetfopen"nosuchfile""r"if$retval=1puts”Anerroroccured"Output:(thisoutputoccursifthereisnofilenamed"nosuchfile"inthecurrentdirectory).Anerroroccur
38、edCatch参数记录一个script的执行情况,如果返回值为1,则执行出错。用来进行错误处理。精品文档精品文档修订记录1引言62语法72.1 脚本、命令和单词符号72.2 置换(substitution)72.2.1 变量置换(variablesubtitution)82.2.2 令置换(commandsubstitution)82.2.3 反斜杠置换(backslashsubstitution)82.2.4 双引号和花括号92.3 tt释93变量103.1 简单变量103.2 数组113.3 目关命令113.3.1set113.3.2 unset113.3.3 appen卸incr124表
39、达式124.1操作数124.21算符和优先级124.吸学函数135List145.1list命令145.2conca命令:145.3lindex命令155.4llength命令155.5linsert命令155.6lreplace令:155.7lrange命令:155.8lappen跄令:155.9lsearch命令:165.10lsorW令:165.11split命令:165.12join命令176控制流176.1if命令176.2循环命令:while、for、foreach176.2.1 while命令176.2.2 for命令186.2.3 foreach<令186.2.4 bre
40、akF口continu瑜令196.2.55 witch命令196.1eva命令196.2sourc吩令197过程(procedure)207.1 过程定义和返回值207.2 局部变量和全局变量207.3 缺省参数和可变个数参数217.4 弓I用:upvar218字符串操作228.1format#令228.2scar令238.3regex流令238.4regsub令258.5strin刑令258.5.1stringcompare?-nocase?-lengthint?string1string2258.5.2stringequal?-nocase?-lengthint?string1string
41、2258.5.3stringfirststring1string2?startindex?268.5.4stringindexstringcharIndex268.5.5stringlaststring1string2?startindex?268.5.6stringlengthstring268.5.7stringmatch?-nocase?patternstring268.5.8stringrangestringfirstlast278.5.9stringrepeatstringcount278.5.10stringreplacestringfirstlast?newstring?278.
42、5.11stringtolowerstring?first?last?278.5.12stringtoupperstring?first?last?278.5.13stringtrimstring?chars?278.5.14stringtrimleftstring?chars?278.5.15stringtrimrightstring?chars?279文件访问289.1 文件名289.2 a本文件输入输出命令289.3 随机文件访问29309.5 文件操作和获取文件信息301佛昔误和异常3310.1 错误3310.2 从TCL脚本中产生错误3410.3 ®用catchf甫获错误3
43、510.4 他异常3510.5 深入TCL3711.1 查询数组中的元素3711.2 info命令3811.2.1 变量信息3811.2.2 ±程信息3911.2.3 命令信息4011.2.4 TCL的版本和库4111.2.5 命令的执行时间4111.2.6 跟踪变量4111.2.7 命令的重命名和删除4311.2.8 unknown令4411.2.9 自动加载4412历史记录4513TCL和CC+4713.1 生成自己的TCLSH4813.2 T展自己的命令:方法(一)4813.2.1 编写扩展命令对应的C/C+过程4813.2.2 册命令4913.2.3 命令返回值和命令对应的过
44、程的返回值5013.3 T展自己的命令:方法(二)5213.3.1 Tcl_Obj结构5213.3.2 写扩展命令对应的C/C+过程5413.3.3 tt册命令5413.4SJ用clientData参数和deletePro参数5513.54C/C+应用程序中嵌入TCL5814总结59精品文档TCL(ToolCommandLanguage)!一种解释执彳T的脚本语言(ScriptingLanguage它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。由于TCL的解释器是用一个CC+语言的过程库实现的,因此在某种意义上我们又可以把TCL看作一个C库,
45、这个库中有丰富的用于扩展TCL命令的CC+过程和函数,可以很容易就在CC+应用程序中嵌入TCL,而且每个应用程序都可以根据自己的需要对TCL语言进行扩展。我们可以针对某一特定应用领域对TCL语言的核心命令集进行扩展,加入适合于自己的应用领域的扩展命令,如果需要,甚至可以加入新的控制结构,TCL解释器将把扩展命令和扩展控制结构与固有命令和固有控制结构同等看待。扩展后的TCL语言将可以继承TCL核心部分的所有功能,包括核心命令、控制结构、数据类型、对过程的支持等。根据需要,我们甚至可以屏蔽掉TCL的某些固有命令和固有控制结构。通过对TCL的扩展、继承或屏蔽,用户用不着象平时定义一种计算机语言那样对
46、词法、语法、语义、语用等各方面加以定义,就可以方便的为自己的应用领域提供一种功能完备的脚本语言。TCL良好的可扩展性使得它能很好地适应产品测试的需要,测试任务常常会由于设计和需求的改变而迅速改变,往往让测试人员疲于应付。利用TCL的可扩展性,测试人员就可以迅速继承多种新技术,并针对产品新特点迅速推出扩展TCL命令集,以用于产品的测试中,可以较容易跟上设计需求的变化。另外,因为TCL是一种比CC+语言有着更高抽象层次的语言,使用TCL可以在一种更高的层次上编写程序,它屏蔽掉了编写CC+程序时必须涉及到的一些较为烦琐的细节,可以大大地提高开发测试例的速度。而且,使用TCL语言写的测试例脚本,即使作
47、了修改,也用不着重新编译就可以调用TCL解释器直接执行。可以省却不少时间。TCL目前已成为自动测试中事实上的标准。1语法简单的讲,TCL语言的语法实际上是一些TCL解释器怎样对TCL命令进行分析的规则的集合。1.1 脚本、命令和单词符号一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的:seta1setb2或seta1;setb2TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL解释器运用规则把命令分成一
48、个个独立的单词,同时进行必要的置换(substitution);在执行阶段,TCL解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C+过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。1.2 置换(substitution)注:在下面的所有章节的例子中,%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。'/'后面是我自己加上的说明,不是例子的一部分。TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如:%setx10/定义变量x,并把x的值赋为1010%setyx+10
49、0/y的值是x+100,而不是我们期望的110x+100上例的第二个命令中,x被看作字符用x+100的一部分,如果我们想使用x的侑'10,就必须告诉TCL解释器:我们在这里期望的是变量x的值,而非字符'x'o怎么告诉TCL解释器呢,这就要用到TCL语言中提供的置换功能。TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。1.2.1 变量置换(variablesubtitution)变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中。例如:%
50、sety$x+100/y勺值是10+100,这里x被置换成它的值1010+100这时,y的值还不是我们想要的值110,而是10+100,因为TCL解释器把10+10*成是一个字符串而不是表达式,y要想得到值110,还必须用命令置换,使得TCL会把10+10*成一个表达式并求值。1.2.2 命令置换(commandsubstitution)命令置换是由口括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。例如:%setyexpr$x+100110y的值是110,这里当TCL解释器遇到字符'时,它就会把随后的expr作为一个命令名,从而激活与exp
51、rM应的C/C+过程,并把expr和变量置换后得到的10+110传递给该命令过程进行处理。如果在上例中我们去掉口,那么TCL会报错。因为在正常情况下,TCL解释器只把命令行中的第一个单词作为看作命令,其他的单词都作为普通字符串处理,看作是命令的参数。注意,口中必须是一个合法的TCL脚本,长度不限。口中脚本的值为最后一个命令的返回值,例如:%setyexpr$x+100;setb300/y勺值为300,因为setb300勺返回值为300300有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参数。1.2.3 反斜杠置换(backslashsubstitution)
52、TCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、$等被TCL解释器当作特殊符号对待的字符。例如:setmsgmultiple'spacems的值为multiplespace如果没有,的话,TCL会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于是发现set命令有多于两个参数,从而报错。加入了'后,空格不被当作分隔符,multiplespace被认为是一个单词(word)。又例如:%setmsgmoney$3333nArraya2/虺个命令的执行结果为:money$3333Arraya2这里的$不再被当作变量置换符。TC
53、L支持以下的反斜杠置换:Backslash SequenceReplaced ByaAudible alert (0x7)bBackspace (0x8)fForm feed (0xc)nNewline (0xa)rCarriage return (0xd)tTab (0x9)vdddVertical tab (0xb)Octal value given by ddd(one, two, or three d's)xhhHex value given by hh(any number of h's) newline space例如:A single space characte
54、r.% set a x48/对应xhh/升六进制的48正好是72,对应H% set a 110府应 ddd/八进制的110正好是72,对应H% set a expr /对应newlinespace,一个命令可以用newline转到下一行继续2+351.2.4 双引号和花括号除了使用反斜杠外,TCL提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号和花括号()。TCL解释器对双引号中的各种分隔符将不作处理,但是对换行符及$和口两种置换符会照常处理。例如:%setx100100%sety"$xddd"100ddd而在花括号中,所
55、有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊处理。%sety/n$xexpr10+100/n$xexpr10+1001.3 注释TCL中的注释符是#,'#'和直到所在行结尾的所有字符都被TCL看作注释,TCL解释器对注释将不作任何处理。不过,要注意的是,#必须出现在TCL解释器期望命令的第一个字符出现的地方,才被当作注释。例如:%#Thisisacomment%seta100#Notacommentwrong#args:shouldbe"setvarName?newValue?"%setb101;#thisisacomment101
56、第二行中#就不被当作注释符,因为它出现在命令的中间,TCL解释器把它和后面的字符当作命令的参数处理,从而导致错误。而第四行的#'就被作为注释,因为前一个命令已经用一个分号结束,TCL解释器期望下一个命令接着出现。现在在这个位置出现#',随后的字符就被当作注释了。2变量TCL支持两种类型的变量:简单变量和数组2.1简单变量一个TCL的简单变量包含两个部分:名字和值。名字和值都可以是任意字符串。例如一个名为13237&*:hdgg”的变量在TCL中都是合法的。不过为了更好的使用置换(substitution),变量名最好按CC+语言中标识符的命名规则命名。TCL解释器在分析
57、一个变量置换时,只把从$符号往后直到第一个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变量的名字。例如:空格符号%seta22seta.144%setb$a.12.1在最后一个命令行,我们希望把变量a.1的值付给b,但是TCL®释器在分析时只把$符号之后直到第一个不是字母、数字或下划线的字符(这里是.')之间的单词符号(这里是'a')当作要被置换的变量的名字,所以TCL®释器把a置换成2,然后把字符用2.1”付给变量b。这显然与我们的初衷不同。当然,如果变量名中有不是字母、数字或下划线的字符,又要用置换,可以用花括号把变量名括起来。例如:
58、%setb$a.14TCL中的se喻令能生成一个变量、也能读取或改变一个变量的值。例如:%setakdfjkjdfkdfjkjdf如果变量a®没有定义,这个命令将生成变量a,并将其值置为kdfjkjdf,若a已定义,就简单的把加勺值置为kdfjkjdf。%setakdfjkjdf这个只有一个参数的se喻令读取a的当前值kdfjkjdf。2.2数组数组是一些元素的集合。TCLB数组和普通计算机语言中的数组有很大的区别。在TC叶,不能单独声明一个数组,数组只能和数组元素一起声明。数组中,数组元素的名字包含两部分:数组名和数组中元素的名字,TC叶数组元素的名字(下标可以为任何字符串。例如:setday(monday)1setday(tuesday)2第一个命令生成一个名为day的数组,同时在数组中生成一个名为monday的数组元素,并把值置为1,第二个命
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DSA原理课件教学课件
- Dreamweaver课件教学课件
- 11 宇宙生命之谜 教学设计-语文六年级上册统编版
- 第18课《在长江源头各拉丹冬》说课稿-2023-2024学年统编版语文八年级下册
- (正式版)DB65∕T 4304.6-2020 《核桃机械化加工设备 第6部分:核桃青皮分离机 作业质量》
- (正式版)DB65∕T 591-2023 《杏树苗木分级规范》
- 2024-2025学年高中物理 第一章 碰撞与动量守恒 1 碰撞说课稿 教科版选修3-5
- 半导体模拟面试题及答案
- 运动姿态模拟测试题及答案
- 2024年肇庆市消防救援支队政府专职消防员招聘笔试真题
- 中医治未病健康宣教
- Ice-O-Matic CIM登峰系列制冰机培训手册
- 《穴位埋线疗法》课件
- 【大型集装箱船舶港口断缆事故预防应急处理及案例探析7500字(论文)】
- 发展汉语-初级读写-第一课-你好
- 律师事务所人事管理制度
- 高中英语完形填空高频词汇300个
- 2023-2025年世纪公园综合养护项目招标文件
- 脑梗塞并出血护理查房
- 男朋友男德守则100条
- 医院感染科室院感管理委员会会议记录
评论
0/150
提交评论