深圳市华为技术有限公司研究管理部文档中心文档编号产品版本密级产品名称:测试平台共78页TCL培训教程(全)(仅供内部使用)拟制:陈旭盛日期:2000/12/08审核:日期:yyyy/mm/dd审核:日期:yyyy/mm/dd批准:日期:yyyy/mm/dd深圳市华为技术有限公司版权所有侵权必究TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第2页,共78页TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第3页,共78页修订记录日期修订版本描述作者2000/12/082.00初稿完成陈旭盛TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第4页,共78页TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第5页,共78页TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第6页,共78页目录1引言62语法72.1脚本、命令和单词符号72.2置换(substitution)72.2.1变量置换(variablesubtitution)82.2.2命令置换(commandsubstitution)82.2.3反斜杠置换(backslashsubstitution)82.2.4双引号和花括号92.3注释93变量103.1简单变量103.2数组113.3相关命令113.3.1set113.3.2unset113.3.3append和incr124表达式124.1操作数124.2运算符和优先级124.3数学函数135List145.1list命令145.2concat命令:145.3lindex命令155.4llength命令155.5linsert命令155.6lreplace命令:155.7lrange命令:155.8lappend命令:155.9lsearch命令:165.10lsort命令:165.11split命令:165.12join命令176控制流176.1if命令176.2循环命令:while、for、foreach176.2.1while命令17TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第7页,共78页6.2.2for命令186.2.3foreach命令186.2.4break和continue命令196.2.5switch命令196.1eval命令196.2source命令197过程(procedure)207.1过程定义和返回值207.2局部变量和全局变量207.3缺省参数和可变个数参数217.4引用:upvar218字符串操作228.1format命令228.2scan命令238.3regexp命令238.4regsub命令258.5string命令258.5.1stringcompare?-nocase??-lengthint?string1string2258.5.2stringequal?-nocase??-lengthint?string1string2258.5.3stringfirststring1string2?startindex?268.5.4stringindexstringcharIndex268.5.5stringlaststring1string2?startindex?268.5.6stringlengthstring268.5.7stringmatch?-nocase?patternstring268.5.8stringrangestringfirstlast278.5.9stringrepeatstringcount278.5.10stringreplacestringfirstlast?newstring?278.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基本文件输入输出命令289.3随机文件访问299.4当前工作目录309.5文件操作和获取文件信息3010错误和异常3310.1错误3310.2从TCL脚本中产生错误3410.3使用catch捕获错误3510.4其他异常35TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第8页,共78页11深入TCL3711.1查询数组中的元素3711.2info命令3811.2.1变量信息3811.2.2过程信息3911.2.3命令信息4011.2.4TCL的版本和库4111.2.5命令的执行时间4111.2.6跟踪变量4111.2.7命令的重命名和删除4311.2.8unknown命令4411.2.9自动加载4412历史记录4513TCL和C\C++4713.1生成自己的TCLSH4813.2扩展自己的命令:方法(一)4813.2.1编写扩展命令对应的C/C++过程4813.2.2注册命令4913.2.3命令返回值和命令对应的过程的返回值5013.3扩展自己的命令:方法(二)5213.3.1Tcl_Obj结构5213.3.2编写扩展命令对应的C/C++过程5413.3.3注册命令5413.4利用clientData参数和deleteProc参数5513.5在C/C++应用程序中嵌入TCL5814总结59TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第9页,共78页TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第10页,共78页TCL培训教程(全)关键词:TCL摘要:本文是TCL教材的第三稿,前两稿分别是《TCL的使用》和《TCL培训教程》。这一稿加入了不少内容,是北研TCL兴趣小组共同努力的结果。本文详细介绍了TCL的各个方面,特别对利用C\C++语言扩展TCL命令作了详细论述。本文附有大量实例。缩略语清单:TCLToolCommandLanguage一种脚本语言参考资料清单:请在表格中罗列本文档所引用的有关参考文献名称、作者、标题、编号、发布日期和出版单位等基本信息。参考资料清单名称作者编号发布日期查阅地点或渠道出版单位(若不为本公司发布的文献,请填写此列)TclandTkToolKitJohnK.Ousterhout981-235-951-61999自己的图书AddisonWesleyPublishingCommpanyTCL的使用陈旭盛自写文档TCL培训教程陈旭盛自写文档1引言TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage)。它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。由于TCL的解释器是用一个C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作一个C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,可以很容易就在C\C++应用程序中嵌入TCL,而且每个应用程序都可以根据自己的需要对TCL语言进行扩展。我们可以针对某一特定应用领域对TCL语言的核心命令集进行扩展,加入适合于自己的应用领域的扩展命令,如果需要,甚至可以加入新的控制结构,TCL解释器将把扩展命令和扩展控制结构与固有命令和固有控制结构同等看待。扩展后的TCL语言将可以继承TCL核心部分的所有功能,包括核心命令、控制结构、数据类TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第11页,共78页型、对过程的支持等。根据需要,我们甚至可以屏蔽掉TCL的某些固有命令和固有控制结构。通过对TCL的扩展、继承或屏蔽,用户用不着象平时定义一种计算机语言那样对词法、语法、语义、语用等各方面加以定义,就可以方便的为自己的应用领域提供一种功能完备的脚本语言。TCL良好的可扩展性使得它能很好地适应产品测试的需要,测试任务常常会由于设计和需求的改变而迅速改变,往往让测试人员疲于应付。利用TCL的可扩展性,测试人员就可以迅速继承多种新技术,并针对产品新特点迅速推出扩展TCL命令集,以用于产品的测试中,可以较容易跟上设计需求的变化。另外,因为TCL是一种比C\C++语言有着更高抽象层次的语言,使用TCL可以在一种更高的层次上编写程序,它屏蔽掉了编写C\C++程序时必须涉及到的一些较为烦琐的细节,可以大大地提高开发测试例的速度。而且,使用TCL语言写的测试例脚本,即使作了修改,也用不着重新编译就可以调用TCL解释器直接执行。可以省却不少时间。TCL目前已成为自动测试中事实上的标准。2语法简单的讲,TCL语言的语法实际上是一些TCL解释器怎样对TCL命令进行分析的规则的集合。2.1脚本、命令和单词符号一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的:seta1setb2或seta1;setb2TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,TCL解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。2.2置换(substitution)TCL培训教程(全)绝密请输入文档编号2020-04-24版权所有,侵权必究第12页,共78页注:在下面的所有章节的例子中,'%'为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提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。2.2.1变量置换(variablesubtitution)变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中。例如:%sety$x+100//y的值是10+100,这里x被置换成它的值1010+100这时,y的值还不是我们想要的值110,而是10+100,因为TCL解释器把10+100看成是一个字符串而不是表达式,y要想得到值110,还必须用命令置换,使得TCL会把10+100看成一个表达式并求值。2.2.2命令置换(commandsubstitution)命令置换是由[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。例如:%sety[expr$x+100]110y的值是110,这里当TCL解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程,并把'expr'和变量置换后得到的'10+110'传递给该命令过程进行处理。如果在上例中我们去掉[],那么TCL会报错。因为在正常情况下,TCL解释器只把命令行中的第一个单词作为看作命令,其他的单词都作为普通字符串处理,看作是命