快速入门上手指导_第1页
快速入门上手指导_第2页
快速入门上手指导_第3页
快速入门上手指导_第4页
快速入门上手指导_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Contents1. WWWH About TCL- 4 -1.1 . What is TCL- 4 -1.2 . Why TCL- 4 -1.3 . When shall we use TCL- 5 -1.4 . How to program using TCL- 5 -2. TCL Basics- 6 -2.1 . Variables and Substitution- 6 -2.1.1 Command set and unset- 6 -2.1.2 Command append- 6 -2.1.3 Command incr- 7 -2.2 . Math Expressions- 7 -2

2、.2.1 General Math Expressions- 7 -2.2.2 Math Functions- 8 -2.3 . String Manipulation- 9 -2.3.1 Command string- 9 -2.3.2 Command format- 14 -2.3.3 Regular Expression- 16 -2.4 . List Manipulation- 20 -2.4.1 Basic TCL List Commands- 20 -2.4.2 Advanced TCL List Commands- 22 -2.5 . File Operations- 25 -2

3、.5.1 Command open- 25 -2.5.2 Command file- 28 -2.6 . Control Flow- 31 -2.6.1 The if command- 31 -2.6.2 Looping and Loop Control commands- 32 -3. TCL extensions- 34 -3.1 . TCL Package Expect- 34 -3.2 . TCL Package Tnm- 35 -4. Appendix- 38 -4.1 . Appendix A, String Commands- 38 -4.2 . Appendix B, List

4、 Commands- 39 -4.3 . Appendix C, Flow Control Commands- 40 -4.4 . Appendix D, Math Functions- 40 -4.5 . Appendix E, References- 41 -1. WWWHAbout TCL本文是针对那些对TCL没有或者有一些基础认识的测试工程师,这个标题中的WWWH并不是一个英文单词,而是一个缩写,这个缩写所提出的问题也基本上是本文所要提出并解决的问题;他们分别是What什么是TCL、Why为什么要使用TCL、When什么时候我们该使用TCL、How如何使用TCL。如果您读到这里觉得这四

5、个问题已经很清楚了,那么此文对您意义不大,不必再浪费时间阅读;如果您对其中的一个或者多个问题仍存有疑惑,也许本文能帮助你找到一些您需要的答案。1.1 . What is TCL在开始认识任何事物之前,我们首先要弄清楚的一件事情就是它到底是什么,做什么用的;学习TCL之前也一样,我先来了解一下TCL到底是什么。TCL的缩写是Tool Command Language,它是一种解释性的脚本语言,TCL以及它的图形界面工具包Tk最早是由美国加州大学伯克利分校(University of California, Berkeley)的John K. Ousterhout教授设计完成的。需要注意的是TCL

6、的两大定位:第一,它是脚本语言;第二,它是解释性的语言。那么什么又是脚本语言,什么又是解释性的脚本语言呢?大多数有工科背景的读者应该知道,计算机是不能直接读懂或者执行高级计算机语言的,计算机只能识别机器码,CPU通过机器码从内存中读取并执行相应的指令。所以高级计算机语言要被计算机识别和运行必须进行一项翻译工作,将高级计算机语言翻译成为机器能读懂的机器语言。有的高级语言在完成编写之后,将翻译这个工作交给编译器来完成,编译器将高级的计算机语言根据预先约定好的规则翻译成机器码,并生成一个机器能识别的可执行文件,经典的程序语言C就是这样的一种高级计算机语言,我们称之为编译性语言。有的语言,在完成编写之

7、后,省略掉翻译这个过程,它不需要编译器来帮助它完成转换。那么机器又是如何读懂这类语言的呢?这种语言,在执行的时候通过自身的解释器进行翻译,也就是说解释器在执行代码的时候才会将其逐行转换成为机器能识别的机器码,从而达到执行的目的。知道了前面的这些信息之后,相信大家会明白,原来这种语言的源文件和编译性语言的源文件是不同的。编译性语言的源文件在完成编译之后就没有用了,没有这个源文件,机器只需要编译后的可执行文件就能完成相应的操作;可解释性语言的源文件在执行过程中才被翻译,在执行过程中还是必须的,这也就是为什么我们称之为脚本(script)语言。读到这里,相信您对解释性脚本语言以及TCL有了个大概的认

8、知,知道了它是什么,那么接下来我就要去问,为什么要用TCL而不用别的解释性脚本语言呢?选择使用TCL有什么好处呢?1.2 . Why TCL在这一小节我们将探讨一下为什么在我们的测试工作中使用解释性脚本语言,以及为什么我们要在测试中使用TCL的脚本而不是其他的解释性脚本语言。本文假定读者对于通信设备的测试工作已经有了基本的认识,所以对于自动化测试的重要性以及自动化测试在测试方法学中的相关理论部分,在本文中不再冗叙。在繁重枯燥的测试工作中,使用计算机语言来编写自动化脚本是提供工作效率、缩短测试周期的重要手段和途径。那么为什么我们要选择TCL这种语言而不选择其他的脚本语言呢?事实上,目前有多种流行

9、的脚本语言,TCL只是其中的一种而已,例如VB、Python、Perl等等;脚本语言在很多行业有着广泛的应用,在通信设备行业中,TCL是众多厂商的共同选择,有很多世界级的通信设备制造商更是有着很高程度的脚本自动化测试;更为重要的是,通信设备测试仪器仪表厂商对于TCL的支持,是大部分通信设备厂商在测试中采用TCL作为自动化测试脚本语言的根本原因之一,例如Spirent Smartbits,IXIA等测试仪器都是支持TCL脚本驱动的。当然脚本语言的无需编译,顺序可执行以及错误处理机制都是脚本语言适用于自动化测试的根本原因,由于这些属于脚本语言的共性,在此就无须冗叙了。1.3 . When shal

10、l we use TCL前面花了一些篇幅来介绍TCL是什么以及为什么要使用TCL,那么您也许比较疑惑,既然脚本语言如此高效,那么是不是把测试工作全部由脚本来实现就好了呢?只要编写好测试脚本,测试工作就会自动完成,测试工程师们也就可以高枕无忧了。如果老板们也是这么想的,那么很不幸,大部分的测试工程师也许都要失业了。事实上,自动化在测试工作中只是多种测试方法和测试途径之一,自动化测试绝对不是万能的从而取代手工测试的。那么作为一个测试工程师,到底该在什么时候使用TCL编写自动化脚本来实现自动化测试呢?总体来说,那些繁琐的机械化的且耗费很多人力的测试比较适合用脚本来实行自动化测试,把测试工程师从繁琐枯

11、燥的重复劳动中解放出来从而能将精力放在一些更加复杂的测试中去。下面列举一些使用TCL开发自动化脚本之前需要考虑的因素,供读者参考:1) 使用TCL开发的自动化脚本应该是由功能性测试(Function testing)阶段和回归测试(Regression test)阶段的需求而驱动编写的,在一些常用的应用场景测试中也可以开发一些重复利用率高的TCL脚本;2) 开发的自动化脚本必须是有较高的重复利用率,如果花很多精力编写一个只会用一两次的脚本是得不偿失的;3) 开发的自动化脚本必须是可读性高的,易于维护的,并且能提供信息收集能力的脚本,一个无法提供错误信息反馈的脚本对于测试是没有价值的;4) 并不

12、是所有的功能测试与回归测试都能通过自动化脚本来完成,当开发一个脚本所需要的精力大大超过手工测试的精力时,要避免使用脚本测试;以上列举出来只是一些基本的需要考量的因素,读者可以根据自身的工作情况灵活决定脚本的开发。有了上面的信息,我们可以开始了解TCL这个脚本语言了,也就是如何使用TCL。1.4 . How to program using TCL在后续的几章节,会重点从变量、数学运算、字符串操作、正则表达式、列表操作、文件操作等几个方面来介绍TCL,通过阅读上述几个方面的内容能对TCL的编写规则以及内嵌命令有初步的了解并能动手编写出一些简单常用的TCL脚本。2. TCL Basics2.1 .

13、 Variables and Substitution 在TCL中,变量可以是单个字符/数字,也可以是字符串,也可以是列表或者是数组。总体来说,TCL中涉及到的常用的变量替换以及操作命令有四个:set、unset、append和incr。2.1.1 Command set and unsetTCL命令set是用来定义变量(字符/数字、字符串、列表、数组),而unset则是用来删除变量的,set与unset互为逆操作。% set a 10;#定义变量a并赋值数字1010% set a b;#定义变量a并赋值字符bb% set a "Hello World!"#定义变量a并赋值

14、字符串”Hello World!”Hello World!% set a 1 2 3 4 5;#定义变量a并赋值列表1 2 3 4 51 2 3 4 5% set arr(a) 1;#定义数组arr并赋值arr(a)数字11通过上面的例子读者应该很容易看出TCL中的变量定义以及赋值的规律,而unset就是set的逆操作,unset a就是删除变量a。2.1.2 Command append命令append的作用是将字符或者字符串直接添加到原变量值的末尾。% set a 0;#定义变量a并赋值数字00% append a x0800;#添加字符串”x0800”到a的尾部0x0800% set b

15、 ""#定义变量b为空字符串% append b ABC;#添加字符串”ABC”到b的尾部ABC% append b D;#添加字符”D”到b的尾部ABCD2.1.3 Command incr命令incr的作用是对变量的值进行增量操作,默认增量为1,但是操作对象仅对于整数。% set a 100;#定义变量a并赋值100100% incr a;#使用默认增量对a作增量操作101% incr a 100;#对a的值增量100201% incr a -101;#对a的值增量-101100在这里顺便介绍一下incr的一个小技巧,灵活使用incr命令可以达到数制转换的目的,可将八进

16、制或者十六进制的数转换为十进制整数。% set a 0x0800;#定义变量a并赋值十六进制数0x08000x0800% incr a 0;#对a的值作0增量达到数制转换的目的2048% set b 0126;#定义变量b并赋值八进制数01260126% incr b 0;#对b的值作0增量达到数制转换的目的862.2 . Math Expressions和其他的高级计算机语言一样,TCL也提供了强大的数学运算功能。TCL解释器本身不支持对数学运算表达式的求值,所有的运算都是通过TCL内嵌命令expr来实现的。TCL中的大部分数学运算符与C语言类似。在这里必须强调的一点是任何的数学表达式都必须

17、通过expr来实现,否则是无法被TCL解释器处理的。% 1+2;#没有使用expr命令的数学表达式invalid command name "1+2"% expr 1+2;#使用了expr命令的数学表达式32.2.1 General Math Expressions对于大家熟知的加减乘除就不再介绍了,运算符和C是一样的;下面通过例子来看看几个常用的数学表达式:逻辑与、逻辑或与选择表达式。注意逻辑与的运算符是&&,逻辑或的运算符是|。% set a 11% set b 00% expr $a&&$b;#逻辑与运算0% expr $a|$b;#逻

18、辑或运算1通过上面的例子细心的读者会发现在进行逻辑与和逻辑或运算的时候变量前面都有一个$符号,这个符号代表变量的值。例如a代表变量的名字,而$a代表的是变量的值,在上面的例子中,$a等于1。注意在TCL的数学运算中是值之间进行运算,所以在表达式中要使用变量值,而不是变量名。下面再通过一个例子来看一下选择表达式,选择表达式的基本格式为:expr ($a<$b)?$a:$b;基本功能是括号中的表达式成立的话则选择a的值,否则选择b的值。% set a 1010% set b 2020% set c expr ($a<$b)?$a:$b;#判断条件成立选择a的值赋给c10% set c

19、expr ($a<$b)?$b:$a;#判断条件成立选择b的值赋给c202.2.2 Math FunctionsTCL同时也提供了丰富的数学运算函数,下面介绍几个会经常使用到的函数。需要注意与再次强调的是,即使是使用数学函数,也是在进行数学运算,因此还是需要用expr命令,否则TCL解释器是无法识别的。1)、取绝对值:abs(x);2)、取整数:int(x);3)、取大于x的最小整数:ceil(x);4)、取小于x的最大整数:floor(x);5)、乘方运算:pow(x,y);6)、开方运算:sqrt(x);7)、三角运算函数:sin(x);cos(x);tan(x);8)、对数运算:l

20、og(x);log10(x);通过下面的例子,读者可以通过自己联系来掌握这些数学函数的使用方法。% set a -6-6% expr abs($a);#取-6的绝对值6% set b 3.14159263.1415926% expr int($b);#对3.1415926取整3% expr ceil($b);#取大于3.1415926的最小整数4.0% expr floor($b);#取小于3.1415926的最大整数3.0% set a 1616% set b 22% expr pow($a,$b);#做16的2次乘方运算256.0% expr sqrt($a);#做16的2次开方运算4.0

21、2.3 . String Manipulation字符串操作是TCL中的最重要的组成部分之一,也是最常用的操作之一。通过前面的一些例子细心的读者应该发现,TCL对于数据类型的要求相对于C来说简直是没有,这是因为TCL把所有的数据都当作字符串进行,这种处理机制使得TCL运算速度大大加快,无需在定义变量时再定义其数据类型,所有的变量值都被同一种机制处理。在这一章节将结合TCL中的string命令、format命令以及正则表达式来介绍TCL的字符串操作,读者可以根据文中的例子练习加深理解。2.3.1 Command string 在TCL的字符串操作命令中,string命令是一个强大且有着丰富扩展的

22、命令集,基本上大部分常用的简单的字符串操作都可以通过使用string命令来完成。下面将string的扩展命令分为字符串比较、字符串匹配以及字符串处理三个类别加以介绍。 . String comparisons在做字符串比较时,使用的最多的是string compare命令与string equal命令。这两个命令在功能上有一些差异,但是在使用方法上又有一些相同的地方。总体上来说,string compare主要用来比较两个字符串的,该命令的返回值可以告诉用户两个被比较的字符串是相等还是有大小关系;而string equal命令只关心比较两个字符串是否相等,不返回两个字符串之间的大

23、小关系。以下为两个命令的基本格式:string comparestring1string2 => 返回值为-1,0和1;分别代表小于、等于和大于;string equalstring1 string2 => 返回值为1和0;分别代表相等与不相等;注意string compare命令的返回值代表的小于和大于是按照英文字母表中的顺序来的,原则是小写字母大于大写字母,字母表顺序越靠后的大于顺序靠前的,也就是a<z>Z>A的顺序,下面通过几个例子来看一下string compare/string equal的基本功能:% string compare "abc&

24、quot; "xyz"-1% string compare "abc" "ABC"1% string compare "ABC" "ABC"0% string equal "abc" "ABC"0% string equal "abc" "abc"1除去string compare与string equal在命令功能上的不同,这两个命令在关键字扩展使用上又有着很多的相同。例如,两个命令都可以用-nocase关键字在字

25、符串比较的时候忽略字符串的大小写差异;两个命令都可以用-length n关键字在字符串比较时只比较前n个字符。通过下面的例子读者可以对关键字的使用有更直观的认识:% string compare -nocase "abc" "ABC"0% string equal -nocase "abc" "ABC"1% string compare -length 3 "abcxyz" "abcdef"0% string equal -length 4 "abcdmn"

26、; "abcdpq"1% string compare -nocase -length 3 "AbCdef" "aBcxyz"0% string equal -nocase -length 2 "XYacbd" "xyzabc" . String matching字符串操作的另一个常见的操作是字符串的匹配,我们通常需要知道某个或某些未知字符串中是否有我们所需要的或感兴趣的某个字符或者部分字符串。TCL中做字符串匹配最常用的命令是string match,该命令有很大的使用灵活度,

27、用户可以通过指定不同的匹配条件来检查字符串的匹配情况。下面我通过string match命令的基本格式和几个例子来了解它的使用方法;其命令基本格式为:string matchpattern string% string match ABC* ABCdefg1% string match abc* ABCdefg0% string match ABC? ABCd1% string match ABC? ABCdefg0% string match -nocase abc* ABCdefg1% string match *.a-z math.h1% string match ?.0-9a-zA-Z

28、 m.01% string match ?.0-9a-zA-Z m.jar0% string match ?.0-9a-zA-Z math.h0通过上面的例子,我可以对于string match命令总结出以下几点使用规律:1)、匹配条件中使用“*”指匹配一个或多个字符;2)、匹配条件中使用“?”指匹配单个字符;3)、该命令同样支持区分大小写的关键字-nocase;4)、该命令支持使用字符的匹配范围定义;需要指出的是string match中对于匹配条件支持了字符范围的定义,但在使用时一定要注意命令的格式,匹配条件必须用“”括起来,而范围必须用“”括起来。String match命令的这一特性使

29、得字符匹配操作的灵活性大大提升,可是它还是局限于比较简单的字符匹配,如果有更加复杂的字符匹配的,就需要使用功能更为强大的正则表达式了。关于正则表达式,会在后面章节专门作介绍。% string first abc 0xabc579abcd 58% string first abc 0xabc579abcd 02除了string match之外,还有两个较为常用的TCL字符/字符串匹配命令:string first和string last。这两个命令的功能比较接近,都是在被匹配字符串中以指定的索引号来查找匹配字符串所出现的索引号,只是前者是查找第一次出现的索引号,而后者是查找最后一次出现的索引号。

30、这两句话读起来会比较拗口一些,如果难以理解,我们通过一些例子就很容易明白是怎么回事了。我们来结合上面的例子来理解一下string first命令是怎么使用的。在例子中,字符串“abc”叫做匹配字符串,而后面的“0xabc579abcd”是被匹配的字符串;稍做观察便可以得知,在被匹配的字符串中包含两处“abc”,也就是例子中的匹配字符串,那么第一个例子最后的那个5又代表什么意思呢?5指的是序列索引,也就是说从被匹配字符串从左向右数,以0为起点的第五个字符处开始做匹配,查找匹配字符串“abc”第一次出现的索引数,读者可以自己数一下,在第一行的例子中,后面第二次出现的“abc”是不是以零为起点的第八

31、个字符处出现的。在第二行的例子中,匹配索引号是0,也就是说从被匹配字符串的最左边开始进行匹配查询,那么很显然匹配字符“abc”第一次出现在以零为起点的第二个字符处。那么string last又是怎么使用的呢?注意!string last和string first在匹配索引号的意义上是完全不一样的!在string last中,索引号代表的意思是从被匹配字符串的最左端起到索引号所制定的字符处,在这段被指定的范围内来查找匹配字符串最后出现的索引号。我们通过例子来理解:% string last abc 0xabc579abcd 0-1% string last abc 0xabc579abcd 52

32、% string last a 0a23456789abcdef 1510% string last a 0a23456789abcdef 91上面例子中的第一行,匹配索引号为0,即范围是空的,也就是说根本没有匹配,所以返回值是“-1”,通过这个例子读者可以发现当string first和string last根本没有匹配的时候返回值是多少;同样的匹配字符串和被匹配字符串,在第二行的例子中可以看到,由于匹配索引号为5,那么匹配检查区间是被匹配字符串的最左边开始到以零为起点的第五个字符处,即“0xabc5”。在这个区间中最后一次出现匹配字符串是在以零为起点的第二个字符处,所以返回值是“2”。第三

33、行与第四行的例子希望读者自己根据上述的规律去读懂以加深理解。下面总结出string first与string last的命令基本格式,注意,这两个命令不像前面介绍的命令那样支持区分大小写开关,这两个命令是不支持-nocase关键字的:string firstsubString string ?startIndex?string lastsubString string ?startIndex? . String processing我们再来看看TCL中的字符串处理。在测试工作中,我们经常需要将从设备得到的信息或反馈加以分析和处理,得到我们所需要的有价值的信息;在编写脚本对设备进行

34、自动化测试时,字符串的处理就是经常会使用的操作之一,在这一小节我们来了解几个简单常用的字符串处理命令,并通过例子来说明他们的使用方法。首先我们来了解一下命令string length。这个命令的作用是以字符数目为单位输出字符串的长度,例如字符串“abcd”的长度就是4,字符串“gh%#9kl”的长度是7。该命令的基本格式为:string lengthstring。通过简单的例子来看一下它的使用方法:% string length ieuwrds9*%&11接下来我们来了解下string repeat。该命令的作用在于重复输出n个用户指定的字符或字符串,通过下面的例子来加深理解:% st

35、ring repeat = 20=% string repeat -SOS- 10-SOS-SOS-SOS-SOS-SOS-SOS-SOS-SOS-SOS-SOS-再来看看两个互为逆操作的字符串输出命令:string toupper和string tolower。前一个命令是将待输出的字符串全部以大写输出,而后面一个则是全部以小写输出:% string toupper abc123XYZABC123XYZ% string tolower abc123XYZabc123xyz然后是返回字符串中的特定位置的单个字符的命令string index:% string index abcdefg 1b%

36、 string index abcdefg 10% string index abcdefg 0a% string index abcdefg -1%可以通过上面的例子看出,string index命令中的索引号也是以零为起点的,如果索引号超过字符串的长度或者是非法数值,命令将不会返回任何结果。上面的string index只能输出字符串中指定位置的单个字符,如果需要输出多个字符怎么办呢?TCL中有一个命令是提供了这个功能的:string range;请读者根据下面的例子对照string index理解string range的用法。% string range abcdefg 0 3abcd

37、% string range abcdefg 0 10abcdefg% string range abcdefg 0 0a% string range abcdefg 0 -1%最后介绍的这几个命令,都是将字符串根据用户需求进行编辑之后再输出的,他们是string trim/trimleft/trimright和string replace。先来看看string trim命令及其扩展命令string trimleft/string trimright。总体来说,这三个命令都是将字符串中的单个或者多个字符去掉再输出;string trimleft是左端去除字符而string trimright是

38、右端去除字符。% string trim abccba abccb% string trim abccba babccba% string trim abccba cabccba% string trimleft abccba abccba% string trimright abccba aabccb% string trim " abccba " a abccba% string trim " abccba "abccba% string trimright " abccba "abccba% string trimleft aa

39、aabccbaaaa abccbaaaa% string trim aaaabccbaaaa abccb% string trim abccba abcc% string trimleft abccba abccba% string trimright abccba ababcc从上面的例子可以看出,string trim/string trimleft/string trimright都只能去除字符串两端的单个或多个字符。如果要去除的字符不指定的,命令会默认去掉字符串两端/左端/右端的空格;如果字符串两端并没有所指定要去除的字符或字符串,则输出原始字符串。以上介绍的只是string命令中一些

40、常见的较简单的用法,读者可以在本文最后的推荐书籍中找到更多关于string命令的用法以及扩展。2.3.2 Command format与C语言中的sprintf函数功能一样,TCL中的format命令使用户能灵活的输出格式化字符串;用户可以根据需要使用format命令及其关键字对待输出字符串做格式处理并加以输出。使用format命令重点在于使用正确的关键字,在这部分内容中会介绍4种常用的format命令关键字:整数到ASCII码转换关键字c、字符串输出关键字s、浮点数输出f、十六进制数输出关键字x/X。通过下面的几个例子读者能进一步理解format命令的用法:% format %c%c%c%c

41、%c 97 112 112 108 101apple% format %s "This is a text string"This is a text string% format %f expr pow(2,3)8.000000% format %x%X 15 15fF由上面的几个例子不难发现format命令的关键字之前都必须使用标识符“%”;读者也许会发现其他的三个关键字都对原来的字符或字符串做了改变输出,但是字符串关键字s却没有任何改变。我们通过下面的例子来学习如何灵活使用字符串关键字s:% format "%20s %5s" "Test

42、 Result" "FAIL" Test Result FAIL% format "%-20s %5s" "Test Result" "PASS"Test Result PASS% format "%-20s %-5s" "Test Result" "PASS"Test Result PASS默认情况下TCL将格式化字符串右端对齐输出,上面第一个例子给第一个格式化字符串定义了20个字符的空间,而字符串“Test Result”只用到了11个字符空

43、间,所以在输出的格式化字符串时左端会有9个空格;在第二个例子中第一个格式化字符串关键字前面多了一个“-”号,这个符号就是用来调整格式化字符串输出左端对齐的,右端对齐的控制符是“+”,由于默认就是右端对齐,所以第二个字符串关键字前面没有加任何控制符。在第三个例子中读者应该可以发现第二个字符串关键字s前也加了左端对齐控制符“-”,但是为什么输出的结果中“PASS”只比第二个例子中的“PASS”左移了一个字符呢?不是应该左端对齐的么?这里需要注意的是字符串格式化输出所定义的空间大小,第二个字符串定义的是5个字符,输出字符串“PASS”或者“FAIL”都只占用了4个字符空间,所谓的左端对齐是按照定义的

44、空间向左对齐,这就是为什么第三个例子中的“PASS”会比第二个中的左移了一个字符的空间;而第一个格式化输出的“Test Result”左对齐之后将9个空格空间加在了字符串尾部,再加上格式定义中的两个字符串间的空格,才成了我们看到的结果中的两个字符串之间的间距。有了格式化输出,那又如何做格式化字符串输入呢?TCL中还支持一个format的逆操作命令scan。由于scan命令与format的关键字等都一样,就不再花篇幅介绍了,下面给出一个例子读者自己读懂并加深理解:% proc NEXT char scan $char %c i format %c expr $i+1% NEXT ab% NEXT

45、 xy2.3.3 Regular Expression在前面讲到string match命令的时候提到过TCL正则表达式,正则表达式的可读性比较差,但是功能却很强大。正则表达式主要的功能就是字符串匹配与替换操作,常用的命令有两个:regexp与regsub;匹配成功表达式返回值为1,否则返回0。首先我们来通过一个例子来看看正则表达式到底是怎么样的:% regexp (0x)?0-9a-fA-F+$ 0x08001上面的例子已经充分说明了正则表达式是可读性很差的,为了灵活的使用正则表达式,我们先来读懂正则表达式。正则表达式中会有一个或者多个操作符,代表了一个或者多个匹配条件,下面列出的是正则表达

46、式最常见的操作符及其代表的意义:1)、“”;匹配字符串首部;2)、“$”;匹配字符串尾部;3)、“*”;零个或者多个匹配;4)、“+”;一个或者多个匹配;5)、“?”;选择性匹配;6)、“|”;多个表达式判断逻辑合并;在这些操作符中首先要掌握的就是首尾匹配操作符,例如“abc”指匹配任何以“abc”开头的字符串,“abc$”则指匹配任何以“abc”结尾的字符串;而“abc$”则指严格匹配字符串“abc”。请读者参考下面的例子:% regexp abc abcdefg1% regexp abc abdcefg0% regexp abc$ xyzabc1% regexp abc$ xyzabk0%

47、 regexp abc$ abc1% regexp abc$ ABC0请读者注意在书写正则表达式的时候建议将匹配条件表达式用“”括起来,与被匹配字符串区分开来,这只是书写上加强易读性的建议,并非语法的严格定义。通过上面的几个例子读者应该已经掌握了字符串首尾匹配操作符的使用方法了,接下来我们继续通过例子来学习三个匹配范围操作符的用法:% regexp abca-z* abc1% regexp abca-z+ abc0% regexp abca-z+ abcd1% regexp abca-z* abcd1% regexp abc* ab1% regexp abc* abc1% regexp abc

48、* abcccc1% regexp abc+ ab0% regexp abc+ abc1% regexp abc+ abcccc1由上面的一组例子可以总结出匹配操作符“*”和“+”的使用方法;前者代表零个或者多个匹配,后者代表一个或多个匹配。再来通过几个例子来看看选择性匹配操作符是怎么使用的:% regexp (TCL)?abc+$ TCLabccc1% regexp (TCL)?abc+$ abccc1% regexp (TCL)abc+$ abccc0% regexp (TCL)abc+$ TCLabccc1通过上面的例子可以发现选择性匹配操作符一般配合“()”使用,当然如果是单个字符也可

49、以不使用括号,但是建议在书写正则表达式的时候统一将选择性匹配字符串使用括号括起来加强易读性。之所以被称为选择性匹配操作符,是由于允许被匹配的字符串中可以包含也可以不包含选择性匹配的部分。读到这里读者们应该对TCL的正则表达式有了个初步的认识,需要加强理解和记忆的是正则表达式的几个匹配操作符,由这几个简单的匹配操作符可以写出很多灵活的匹配条件,注意,目前为止我们讲的正则表达式的例子都是正向匹配,其实通过首部匹配符“”也是可以实现排他性的反向匹配的,下面的几个例子就是介绍首部匹配符在匹配作用域中的应用:% regexp 45a-g 45d1% regexp 45a-g 45d0% regexp 4

50、5a-g 45z1我们再来通过例子学习下匹配操作符“|”的作用:% regexp (0x)?0-9a-fA-F+$|0-9+$ 0x08001% regexp (0x)?0-9a-fA-F+$|0-9+$ 20461% regexp (0x)?0-9a-fA-F+$|0-9+$ 0xxyz0% regexp (0x)?0-9a-fA-F+$|0-9+$ xyz0上面的几个例子中的正则表达式的作用是匹配任意的十六进制或十进制数,在例子中,匹配操作符“|”将两个匹配条件连接成了一个表达式,形成了一个并列的多判断条件的表达式。在逐个了解了匹配操作符的作用之后,我们通过几个综合的例子来巩固一下用reg

51、exp命令书写的正则表达式,请读者结合前面的讲解认真读懂下面的每个例子:% regexp (0x)?0-9a-fA-F+$ 0x08001% regexp (0x)?0-9a-fA-F$ 0x08000% regexp (0x)?0-9a-fA-F$ 0x01% regexp (0x)0-9a-fA-F+$ 08000% regexp (0x)?0-9a-fA-F+$ 08001% regexp (0x)?0-9a-fA-F+$ 0x0% regexp (0x)?0-9a-fA-F*$ 0x1% regexp (0x)?0-9a-f+$ 0xFFFF0% regexp -nocase (0x)

52、?0-9a-f+$ 0xFFFF1细心的读者会发现原来regexp命令也是支持nocase关键字的。不仅如此,regexp命令书写的正则表达式还有给变量赋值的功能,当表达式的被匹配字符串后面还跟有字符,会被当作变量处理,如果正则表达式匹配成功,会将被匹配字符串赋给这些变量,我们通过一个例子来说明:% regexp -nocase (a-z+) *(0-9+) *(a-z+) "Walk 10 km" a b c d1% puts "$a;$b;$c;$dr"Walk 10 km;Walk;10;km 上面的例子中表达式的判定条件是以一个由字母组成的字符串

53、开头,在零个或多个空格后接上一个十进制数字,又在零个或多个空格之后再接上一个由字母组成的字符串。被匹配字符串“Walk 10 km”是符合表达式的判定条件的,所以表达式返回值为1;注意在被匹配字符串之后还有4个字符,这4个字符就被当做了变量(注意只有当表达式匹配成功返回值为1时变量才会被赋值)。那么正则表达式是以什么规则给变量赋值的呢?由上面的例子我们可以总结出赋值的规律:紧跟在被匹配字符串后的第一个变量会被赋值整个被匹配字符串;第二个变量会被赋值表达式中第一个匹配条件所匹配的字符串部分;第三个变量会被赋值表达式中第二个匹配条件所匹配的字符串部分,依此类推。当变量数目大于表达式匹配条件数目加一

54、,则多出的变量会全部被赋值为空字符串。例如上面的例子如果再有一个变量e,那么e的值将是空字符串,读者可以自己结合上面的例子练习一下,体会正则表达式的赋值功能。关于使用regexp命令书写的正则表达式字符串匹配内容在这里就告一段落,希望读者认真读懂所给出的每一个例子,最好自己再加以练习,正则表达式由于其易读性较差,所以在书写的时候更是要逻辑清晰条理清楚。下面我们来学习TCL正则表达式中的第二个常用的命令,用于字符串替换赋值操作的regsub命令。与regexp命令不一样,regsub命令的作用在于替换操作并赋值;首先通过一个例子来看看regsub命令是如何使用的:% regsub there &

55、quot;They live there lives" their x1% puts $xThey live their lives由上面的例子可以看出regsub命令用被替换字符串去匹配被匹配字符串并将匹配到的字符串替换成新的替换字符串;然后将新的字符串赋值给变量。其命令格式为:regsub ?switches? exp string subSpec ?varName?注意regsub如果匹配失败返回0,最后的变量仍旧会被赋值,其值是被匹配字符串不做任何替换修改直接赋值给变量。从regsub命令的格式中可以看出它是支持一些关键字的,例如nocase大小写的关键字以及常用的关键字-a

56、ll等。下面通过例子来看看关键字-all的使用方法:% regsub a-zA-Z+ "They live there lives" N/A x1% puts $xN/A live there lives% regsub -all a-zA-Z+ "They live there lives" N/A x4% puts $xN/A N/A N/A N/A% regsub -nocase a-z+ "They live there lives" N/A x1% puts $xN/A live there lives% regsub -nocase -all a-z+ "They live there lives" N/A x4% puts $xN/A N/A N/A N/A除了以上的用法之外,regsub命令还支持一些特殊的替换操作符,例如“&”和“0”。这两个替换操作符的作用是一样的,都是将匹配到的字符或字符串替换成匹配字符或字符串本身。这些替换操作符的使用并不常见,读者根据下面例子能读懂就可以了。% regsub -all a|b acaab && x4% puts $xaacaaaabb% regsub -all a|b a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论