《2022年TCL培训教程.doc》由会员分享,可在线阅读,更多相关《2022年TCL培训教程.doc(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、TCL培训教程(全)(内部使用)深圳市华为技术目 录1引言52语法62.1脚本、命令和单词符号62.2置换(substitution)62.2.1变量置换(variable subtitution)72.2.2命令置换(command substitution)72.2.3反斜杠置换(backslash substitution)82.2.4双引号和花括号82.3注释93变量93.1简单变量93.2数组103.3相关命令113.3.1set113.3.2unset113.3.3append和incr114表达式124.1操作数124.2运算符和优先级121.1数学函数132List142.1l
2、ist命令142.2concat命令:142.3lindex命令142.4llength命令142.5linsert命令152.6lreplace命令:152.7lrange 命令:152.8lappend命令:152.9lsearch 命令:152.10lsort命令:162.11split命令:162.12join命令163操纵流173.1if命令173.2循环命令:while 、for、 foreach173.2.1while命令173.2.2for命令183.2.3foreach命令183.2.4break和continue命令193.2.5switch 命令193.3eval命令19
3、3.4source命令204过程(procedure)204.1过程定义和返回值204.2部分变量和全局变量204.3缺省参数和可变个数参数214.4援用:upvar225字符串操作225.1format命令235.2scan命令235.3regexp命令231.1regsub命令251.2string命令251.2.1string compare ?-nocase? ?-length int? string1 string2261.2.2string equal ?-nocase? ?-length int? string1 string2261.2.3string first string
4、1 string2 ?startindex?261.2.4string index string charIndex261.2.5string last string1 string2 ?startindex?261.2.6string length string261.2.7string match ?-nocase? pattern string261.2.8string range string first last271.2.9string repeat string count271.2.10string replace string first last ?newstring?27
5、1.2.11string tolower string ?first? ?last?271.2.12string toupper string ?first? ?last?271.2.13string trim string ?chars?281.2.14string trimleft string ?chars?281.2.15string trimright string ?chars?282文件访咨询282.1文件名282.2根本文件输入输出命令282.3随机文件访咨询302.4当前工作目录302.5文件操作和获取文件信息303错误和异常343.1错误343.2从TCL脚本中产生错误35
6、3.3使用catch捕获错误363.4其他异常361深化TCL381.1查询数组中的元素381.2info命令391.2.1变量信息401.1.1过程信息401.1.2命令信息411.1.3TCL的版本和库421.1.4命令的执行时间421.1.5跟踪变量421.1.6命令的重命名和删除451.1.7unknown命令451.1.8自动加载462历史记录473TCL和CC+493.1生成本人的TCLSH493.2扩展本人的命令:方法(一)503.2.1编写扩展命令对应的C/C+过程503.2.2注册命令513.2.3命令返回值和命令对应的过程的返回值523.3扩展本人的命令:方法(二)543.
7、3.1Tcl_Obj构造543.3.2编写扩展命令对应的C/C+过程563.3.3注册命令573.4利用clientData参数和deleteProc参数573.5在C/C+应用程序中嵌入TCL604总结61TCL培训教程(全)关键词:TCL 摘 要:本文是TCL教材的第三稿,前两稿分别是TCL的使用和TCL培训教程。这一稿参加了不少内容,是北研TCL兴趣小组共同努力的结果。本文详细介绍了TCL的各个方面,特别对利用CC+语言扩展TCL命令作了详细阐述。本文附有大量实例。缩略语清单: TCL Tool Command Language 一种脚本语言参考材料清单: 请在表格中罗列本文档所援用的有
8、关参考文献名称、作者、标题、编号、发布日期和出版单位等根本信息。参考材料清单名称作者编号发布日期查阅地点或渠道出版单位(假设不为本公司发布的文献,请填写此列)Tcl and Tk ToolKitJohn K.Ousterhout98123595161999本人的图书Addison Wesley Publishing CommpanyTCL的使用陈旭盛自写文档TCL培训教程陈旭盛自写文档1 引言TCL(Tool Command Language)是一种解释执行的脚本语言(Scripting Language)。 它提供了通用的编程才能:支持变量、过程和操纵构造;同时TCL还拥有一个功能强大的固有
9、的核心命令集。由于TCL的解释器是用一个CC+语言的过程库实现的,因而在某种意义上我们又能够把TCL看作一个C库,这个库中有丰富的用于扩展TCL命令的CC+过程和函数,能够特别容易就在CC+应用程序中嵌入TCL,而且每个应用程序都能够依照本人的需要对TCL语言进展扩展。我们能够针对某一特定应用领域对TCL语言的核心命令集进展扩展,参加合适于本人的应用领域的扩展命令,假如需要,甚至能够参加新的操纵构造,TCL解释器将把扩展命令和扩展操纵构造与固有命令和固有操纵构造同等对待。扩展后的TCL语言将能够继承TCL 核心部分的所有功能,包括核心命令、操纵构造、数据类型、对过程的支持等。依照需要,我们甚至
10、能够屏蔽掉TCL的某些固有命令和固有操纵构造。通过对TCL的扩展、继承或屏蔽,用户用不着象平时定义一种计算机语言那样对词法、语法、语义、语用等各方面加以定义,就能够方便的为本人的应用领域提供一种功能完备的脚本语言。TCL良好的可扩展性使得它能特别好地习惯产品测试的需要,测试任务常常会由于设计和需求的改变而迅速改变,往往让测试人员疲于应付。利用TCL的可扩展性,测试人员就能够迅速继承多种新技术,并针对产品新特点迅速推出扩展TCL命令集,以用于产品的测试中,能够较容易跟上设计需求的变化。另外,由于TCL是一种比CC+ 语言有着更高抽象层次的语言,使用TCL能够在一种更高的层次上编写程序,它屏蔽掉了
11、编写CC+程序时必须涉及到的一些较为烦琐的细节,能够大大地提高开发测试例的速度。而且, 使用TCL语言写的测试例脚本,即便作了修正,也用不着重新编译就能够调用TCL解释器直截了当执行。能够省却不少时间。TCL 目前已成为自动测试中事实上的标准。2 语法简单的讲,TCL语言的语法实际上是一些TCL解释器怎么样对TCL命令进展分析的规则的集合。2.1 脚本、命令和单词符号一个TCL脚本能够包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的:set a 1set b 2或set a 1;set b 2TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是
12、这个命令的参数,单词之间必须用空格或TAB键隔开。TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器运用规则把命令分成一个个独立的单词,同时进展必要的置换(substitution); 在执行阶段,TCL 解释器会把第一个单词当作命令名,并查看这个命令是否有定义,假如有定义就激活这个命令对应的C/C+过程,并把所有的单词作为参数传递给该命令过程,让命令过程进展处理。2.2 置换(substitution)注:在下面的所有章节的例子中,为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。/后面是我本人加上的说明,不是例子的一部分。TCL解释
13、器在分析命令时,把所有的命令参数都当作字符串对待,例如:%set x 10 /定义变量x,并把x的值赋为1010%set y x+100 /y的值是x+100,而不是我们期望的110x+100上例的第二个命令中,x被看作字符串x+100的一部分,假如我们想使用x的值10 ,就必须告诉TCL解释器:我们在这里期望的是变量x的值,而非字符x。如何告诉TCL解释器呢,这就要用到TCL语言中提供的置换功能。TCL提供三种方式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换能够发生在包括命令名在内的每一个单词中,而且置换能够嵌套。2.2.1 变量置换(va
14、riable subtitution)变量置换由一个符号标记,变量置换会导致变量的值插入一个单词中。例如:%set y $x+100 /y的值是10+100,这里x被置换成它的值1010100这时,y的值还不是我们想要的值110,而是10+100,由于TCL解释器把10+100看成是一个字符串而不是表达式,y要想得到值110,还必须用命令置换,使得TCL会把10+100看成一个表达式并求值。2.2.2 命令置换(command substitution)命令置换是由括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。例如:%set y expr $x+
15、100110y的值是110,这里当TCL解释器遇到字符时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C+过程,并把expr和变量置换后得到的10+110传递给该命令过程进展处理。假如在上例中我们去掉,那么TCL会报错。由于在正常情况下,TCL解释器只把命令行中的第一个单词作为看作命令,其他的单词都作为一般字符串处理,看作是命令的参数。 留意,中必须是一个合法的TCL脚本,长度不限。中脚本的值为最后一个命令的返回值,例如:%set y expr $x+100;set b 300 /y的值为300,由于set b 300的返回值为300300有了命令置换,实际上就表示命令之
16、间是能够嵌套的,即一个命令的结果能够作为别的命令的参数。2.2.3 反斜杠置换(backslash substitution)TCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、$等被TCL解释器当作特别符号对待的字符。例如:set msg multiple space /msg的值为multiple space。假如没有的话,TCL会报错,由于解释器会把这里最后两个单词之间的空格认为是分隔符,因而发觉set命令有多于两个参数,从而报错。参加了后,空格不被当作分隔符,multiple space被认为是一个单词(word)。又例如: %set msg
17、money $3333 nArray a2 /这个命令的执行结果为:money $3333 Array a2这里的$不再被当作变量置换符。TCL支持以下的反斜杠置换:Backslash Sequence Replaced Bya Audible alert (0x7)b Backspace (0x8)f Form feed (0xc)n Newline (0xa)r Carriage return (0xd)t Tab (0x9)v Vertical tab (0xb)ddd Octal value given by ddd(one, two, or three ds)xhh Hex valu
18、e given by hh(any number of hs) newline space A single space character.例如: set a x48 /对应 xhhH /十六进制的48正好是72,对应H set a 110 /对应 dddH /八进制的110正好是72,对应Hset a expr / 对应newline space,一个命令能够用newline转到下一行接着 2+352.2.4 双引号和花括号 除了使用反斜杠外,TCL提供另外两种方法来使得解释器把分隔符和置换符等特别字符当作一般字符,而不作特别处理,这就要使用双引号和花括号()。TCL解释器对双引号中的各种
19、分隔符将不作处理,但是对换行符 及和两种置换符会照常处理。例如:%set x 100100%set y $x ddd 100 ddd而在花括号中,所有特别字符都将成为一般字符,失去其特别意义,TCL解释器不会对其作特别处理。%set y /n$x expr 10+100 /n$x expr 10+100 2.3 注释TCL中的注释符是,和直到所在行结尾的所有字符都被TCL看作注释,TCL解释器对注释将不作任何处理。不过,要留意的是,必须出如今TCL解释器期望命令的第一个字符出现的地点,才被当作注释。例如:%This is a comment%set a 100 # Not a commentw
20、rong # args: should be set varName ?newValue?%set b 101 ; # this is a comment101第二行中就不被当作注释符,由于它出如今命令的中间,TCL解释器把它和后面的字符当作命令的参数处理,从而导致错误。而第四行的就被作为注释,由于前一个命令已经用一个分号完毕,TCL解释器期望下一个命令接着出现。如今在这个位置出现#,随后的字符就被当作注释了。3 变量TCL支持两品种型的变量:简单变量和数组。3.1 简单变量 一个TCL的简单变量包含两个部分:名字和值。名字和值都能够是任意字符串。例如一个名为 “1323 7*: hdgg的变
21、量在TCL中都是合法的。不过为了更好的使用置换(substitution),变量名最好按CC+语言中标识符的命名规则命名。 TCL解释器在分析一个变量置换时,只把从符号往后直到第一个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变量的名字。例如:% set a 22set a.1 44% set b $a.12.1在最后一个命令行,我们希望把变量a.1的值付给b,但是TCL解释器在分析时只把$符号之后直到第一个不是字母、数字或下划线的字符(这里是.)之间的单词符号(这里是a)当作要被置换的变量的名字,因而TCL解释器把a置换成2,然后把字符串“2.1”付给变量b。这显然与我们的初衷不
22、同。所以,假如变量名中有不是字母、数字或下划线的字符,又要用置换,能够用花括号把变量名括起来。例如:%set b $a.14TCL中的set命令能生成一个变量、也能读取或改变一个变量的值。例如: set a kdfj kjdfkdfj kjdf假如变量a还没有定义,这个命令将生成 变量a,并将其值置为kdfj kjdf,假设a已定义,就简单的把a的值置为kdfj kjdf。set akdfj kjdf 这个只有一个参数的set命令读取a的当前值kdfj kjdf。 3.2 数组 数组是一些元素的集合。TCL的数组和一般计算机语言中的数组有特别大的区别。在TCL中,不能单独声明一个数组,数组只能
23、和数组元素一起声明。数组中,数组元素的名字包含两部分:数组名和数组中元素的名字,TCL中数组元素的名字(下标能够为任何字符串。例如: set day(monday) 1 set day(tuesday) 2 第一个命令生成一个名为day的数组,同时在数组中生成一个名为monday的数组元素,并把值置为1,第二个命令生成一个名为tuesday的数组元素,并把值置为2。 简单变量的置换已经在前一节讨论过,这里讲一下数组元素的置换。除了有括号之外,数组元素的置换和简单变量类似。例: set a mondayset day(monday) 1set b $day(monday) /b的值为1,即day
24、(monday)的值。set c $day($a) /c的值为1,即day(monday)的值。TCL不能支持复杂的数据类型,这是一个特别大的缺憾,也是TCL受指责特别多的方面。但是TCL的一个扩展ITCL填补了这个缺憾。3.3 相关命令3.3.1 set这个命令在3.1已有详细介绍。3.3.2 unset 这个命令从解释器中删除变量,它后面能够有任意多个参数,每个参数是一个变量名,能够是简单变量,也能够是数组或数组元素。例如:% unset a b day(monday)上面的语句中删除了变量a、b和数组元素day(monday),但是数组day并没有删除,其他元素还存在,要删除整个数组,只
25、需给出数组的名字。例如:%puts $day(monday)cant read day(monday): no such element in array% puts $day(tuesday)2%unset day% puts $day(tuesday)cant read day(tuesday): no such variable3.3.3 append和incr这两个命令提供了改变变量的值的简单手段。append命令把文本加到一个变量的后面,例如:% set txt hellohello% append txt ! How are youhello! How are youincr命令把
26、一个变量值加上一个整数。incr要求变量原来的值和新加的值都必须是整数。%set b aa% incr bexpected integer but got a%set b 22%incr b 354 表达式TCL中的表达式类似于ANSI C的表达式。表达式由操作数和操作符构成,下面分别介绍。4.1 操作数TCL表达式的操作数通常是整数或实数。整数一般是十进制的, 但假如整数的第一个字符是0(zero),那么TCL将把这个整数看作八进制的,假如前两个字符是0x则这个整数被看作是十六进制的。TCL的实数的写法与ANSI C中完全一样。如:2.17.9e+126e43. 4.2 运算符和优先级 下面
27、的表格中列出了TCL中用到的运算符,它们的语法方式和用法跟ANSI C中特别类似。这里就不一一介绍。下表中的运算符是按优先级从高到低往下陈列的。同一格中的运算符优先级一样。语法方式结果操作数类型-a!aa负a非aint,floatint,floatinta*ba/ba%b乘除取模int,floatint,floatinta+ba-b加减int,floatint,floatab左移位右移位intintaba=b小于大于小于等于大于等于int,float,stringint,float,stringint,float,stringint,float,stringa= =ba!=b等于不等于int,
28、float,stringint,float,stringab位操作与intab位操作异或inta|b位操作或intab逻辑与int,floata|b逻辑或int,floata?b:c选择运算a:int,float 1.1 数学函数TCL支持常用的数学函数,表达式中数学函数的写法类似于CC+语言的写法,数学函数的参数能够是任意表达式,多个参数之间用逗号隔开。例如:%set x 22% expr 2* sin($x0 . elseif $x1 . elseif $x2 . else . 留意,上例中一定要写在上一行,由于假如不如此,TCL 解释器会认为if命令在换行符处已完毕,下一行会被当成新的命
29、令,从而导致错误的结果。在下面的循环命令的书写中也要留意这个咨询题。书写中还要留意的一个咨询题是if 和之间应该有一个空格,否则TCL解释器会把if作为一个整体当作一个命令名,从而导致错误。3.2 循环命令:while 、for、 foreach3.2.1 while命令语法为: while test body参数test是一个表达式,body是一个脚本,假如表达式的值非0,就运转脚本,直到表达式为0才停顿循环,如今while命令中断并返回一个空字符串。例如:假设变量 a 是一个链表,下面的脚本把a 的值复制到b:set b set i expr llength $a -1while $i=0lappend b lindex $a $iincr i -13.2.2 for命令语法为: for init test reinit body参数init是一个初始化脚本,第二个参数test是一个表达式,用来决定循环什么时候中断,第三个参数reinit是一个重新初始化的脚本,第四个参数body也是脚本,代表循环体。下
限制150内