版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Tcl简介(一):Tcl语法Tcl语法Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对Tcl有很好的描述和说明。如果你看起来很吃力,那是因为Tcl与一般的语言有一些不同之处,刚开始可能有一些不理解,但很快就会掌握的。请坚持一下,我能坚持写完,你至少也应该坚持读一遍吧!TclOverview这篇文章里包含了几乎Tcl的全部。文章的作者是Tcl的缔造者JohnOusterhout,对Tcl的诠释非常清楚。Introduction简介Tcl代表toolcommandlanguage发音为tickle.。它实际上包含了两个部分
2、:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shello它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。应用程序使用Tcl作为它的命令语言有三个好处:1 Tcl提供了标准语法,一旦用户掌握了Tcl就
3、可以很容易的发布命令给基于Tcl的程序。2 Tcl实现了很多的功能,使你的工作变得很方便。3 TCl可作为程序间通信的接口。TclInterpreters解释器在Tcl的数据结构中的核心是Tcl_Interp,一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。每一个Tcl命令是在特定的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Interp。Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。TclDataTypes数据类型Tcl只支持一种数据结构:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这
4、一点,所有的东西都是字符串。然而字符串的实际解释是依赖于上下文或命令的。它有三种形式:命令(command),表达式(expresion)和表(list)。下面会讨论细节。BasicCommandSyntax基本语法Tcl有类似于shell和lisp的语法,当然也有许多的不同。一条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。例如:seta22相当于C中的a=22a是一个变量这条命令分为三个域:1:set2:a3:22set使用于设置变量的值的命令,a、20作为参数来传
5、给它,a使它要操作的变量名,22是要付给的a值。Tcl的命令名可以使内建的命令也可以是用户建的新命令,在应用程序中用函数Tcl_CreateCommand来创建。所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。命令的名字必须被打全,但Tcl解释器找不到一同名的命令时会用unknown命令来代替。在很多场合下,unknown会在库目录中搜寻,找到一个的话,会自动生成一个Tcl命令并调用它。unknown经常完成缩略的命令名的执行。但最好不要使用。Comments注释和shell很象,第一个字母是#的Tcl字符串是注释。Groupingargumentswithdouble-quot
6、es用双弓I号来集群参数用双引号来集群参数的目的在于使用有空白的参数。例如:setathisstringcontainswhitespace如够一个参数一双引号来开始,该参数会一直到下一个双引号才结束。其中可以有换行符和分号。子替换是在正式运行该调命令之前由分析器作的Variablesubstitutionwith$用美元符进行变量替换说白了就是引用该变量。如:setahellosetb$a/b=hello实际上传给set命令的参数是b,hellosetca/b=aCommandsubstitutionwithbrackets命令子替换(用方括号)例如:setasetbhello实现执行set
7、bhello并用其结果来替换源命令中的方括号部分,产生一条新命令setahello/hello为setbhello的返回值最终的结果是b=helloa=hello当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分都被视为Tcl命令。一个复杂一点的例子:setaxyzsetbabc.setcdef/returnxyzabcdefBackslashsubstitution转移符替换转移符时间不可打印字符或由它数意义的字符插入进来。这一概念与C语言中的一样。bBackspace(0x8).fFormfeed(0xc)
8、.nNewline(0xa).rCarriage-return(0xd).tTab(0x9).vVerticaltab(0xb).Leftbrace().Rightbrace().Openbracket().Closebracket().$Dollarsign($).spSpace():doesnotterminateargument.;Semicolon:doesnotterminatecommand.Double-quote.Groupingargumentswithbraces用花扩括号来集群参数用花扩括号来集群参数与用双引号来集群参数的区别在于:用花扩括号来集群参数其中的三种上述的子替
9、换不被执行。而且可以嵌套。例如:setaxyzabcd/set收到俩个参数axyzab/cdevalseta22setb33/eval收到一个参数seta22nsetb33Commandsummary命令综述1 .一个命令就是一个字符串(string)。2 .命令是用换行符或分号来分隔的。3 .一个命令由许多的域组成。第一个于是命令名,其它的域作为参数来传递。4 .域通常是有空白(Tab横向制表健Space空格)来分开的5 .双引号可以使一个参数包括换行符或分号。三种子替换仍然发生。6 .花括号类似于双引号,只是不进行三总体换7 .系统只进行一层子替换,机制替换的结果不会再去做子替换。而且子替
10、换可以在任何一个域进行。8 .如果第一个非控字符是#,这一行的所有东西都是注释。Expressions表达式对字符串的一种解释是表达式。几个命令将其参数按表达式处理,如:expr、for和if,并调用Tcl表达式处理器(Tcl_ExprLong,Tcl_ExprBoolean等)来处理它们。其中的运算符与C语言的很相似。!逻辑非*/%+-<<>>左移右移只能用于整数。<><=>=!=逻辑比较&A|位运算和异或或&&|逻辑和或x?y:zIf-then-else与C的一样Tcl中的逻辑真为1,逻辑假为0。5/4.05/(str
11、inglengthabcd+0.0)计算字符串的长度转化为浮点数来计算0x03>20y<0x12都返回1seta1expr$a+2expr1+2都返回3Lists列表字符串的另一种解释为列表。一个列表是类似于结果的一个字符串包含了用空白分开的很多域。例如AlSueAnneJohn是一个有四个元素的例表,在列表中换行父被视为分隔符。例如:bcdefgh是一个有三个元素的列表b、c和defgh。Tcl的命令concat,foreach,lappend,lindex,linsert,list,llength,lrange,lreplace,lsearch,和lsort可以使你对歹U表操作
12、。Regularexpressions正贝U表达式Tcl提供了两个用于正则表达式的命令regexp和regsub这里的正则表导师实际上是扩展的正则表达式,与egrep相一致。支持八$.+?><()|Commandresults命令结果每一条命令有俩个结果:一个退由值和一个字符串。退由值标志着命令是否正确执行,字符串给由附加信息。有效的返回制定议在,tcl.h,如下:TCL_OK命令正确执行,字符串给由了命令的返回值。TCL_ERROR表示有一个错误发生,字符串给由了错误的描述。全局变量errorinfo包含了人类可读的错误描述,全局变量errorCode机器使用的错误信息。TCL_
13、RETURN表示return命令被调用,当前的命令(通常是一个函数)必须立刻返回,字符串包含了返回值。TCL_BREAK表示break已经被调用,最近的巡环必须立刻返回并跳由。字符串应该是空的。TCL_CONTINUE表示continue已经被调用,最近的巡环必须立刻返回不跳由。字符串应该是空的。Tcl编程者一般需要关心退由值。当Tcl解释器发现错误发生后会立刻停止执行。Procedures函数Tcl允许你通过proc命令来扩充命令(定义新的命令),定义之后可以向其它的内建命令一样使用。例如:procpfstrputs$strpfhelloworld这里有一个初学者不注意的地方,上述的定义一定
14、要写成那样子。而不能向下面那样写:procpfstrputs$str因为proc实际上也只不过是一条命令,是一换行符或分号来结束的,用集群参数来传递函数体。proc的定义如下:procnameargstclcommandVariables:scalarsandarrays变量:标量和向量(即数组)向量就是数组,而标量是没有下表的变量。我们用C来类比:inti;/i是标量intj10;/j是向量变量不需要定义,使用的时候会自动的被创建。Tcl支持两种变量:标量和向量举个例子来说明吧,seti100setj(0)10setk(1,3)20i是标量,j是向量。引用的时候:$i$j(0)$k(1,3)
15、Tcl简介(二):Tcl内建命令Tcl内建命令Built-incommands内建的命令Tcl提供了下面描述的内建函数。.表示参数不定appendvarNamevalueappendvarNamevaluevaluevalue.将那一大堆value附加到varName后面。如果变量不存在,会新建一个。例子:setiaaaappendibbbccc/i=aaabbbcccarraysubcommandarrayNamearraysubcommandarrayNamearg.这是一组用于向量操作的命令。第二个参数是子命令名。假设:seta(1)1111seta(2)2222seta(three)3
16、333一下均以它为例子(tclsh在中运行)。arraynamesarrayName返回一个数组元素名字的列表。tclsh>arraynamesa12threearraysizearrayName返回数组的元素个数。tclsh>arraysizea3下面是用于遍历的命令arrrystartsearcharrayName初始化一次遍历,返回一个遍历标示(searchld)在下面的命令是中使用。arraynextelementarrayNamesearchld返回下一个数组中的元素。如果没有返回一个空串。arrayanymorearrayNamesearchld返回1表示还有更多的元素
17、。0表示没有了。arraydonesearcharrayNamesearchld结束该次遍历。arraynextelementarrayNamesearchld返回下一个元素。tclsh>arraystartsearchas-1-atclsh>arraynextelementas-1-a1111tclsh>arraynextelementas-1-a2222tclsh>arrayanymoreas-1-a1tclsh?arraynextelementas-1-a3333tclsh>arraydonesearchas-1-a注意可以同时并发多个遍历。break跳由最
18、近的循环。casestringinpatListbody.casestringpatListbody.casestringinpatListbodycasestringpatListbody.分支跳转。例如:caseabcinabputs1defaultputs2a*puts3return3.caseainabformat1defaultformat2a*format3returns1.casexyzabformat1defaultformat2a*format3returns2.注意default不可以放在第一位。支持shell文件名风格的匹配符。catchcommandcatchcomma
19、ndvarName用于阻止由于错误而导致中断执行。执行command,每次都返回TCL_OK,无论是否有错误发生。如有错误发生返回1,反之返回0。如果给了varName这被置为错误信息。注意varName是已经存在的变量。cdcddirName转换当前工作目录。如dirName未给由则转入home目录closefileld关闭文件描述符。concatarg.将参数连接产生一个表。concatabcdefghreturnabcdefghcontinue结束该次循环并继续循环。eoffileId如fileId以结束返回1,反之返回0。errormessageerrormessageinfoerro
20、rmessageinfocode返回一个错误,引起解释器停止运行。info用于初始化全局变量errorInfo。code被付给errorCode。evalarg.将所有的参数连起来作为命令语句来执行。execarg.仿佛是在shell下执行一条命令execls-colorexeccat/etc/passwd>/tmp/aexitexitreturnCode中断执行。exprarg处理表达式。setaexpr1+1/a=2filesubcommandname一组用于文件处理的命令。filesubcommandnamearg.fileatimename返回文件的最近存取时间。filedirn
21、amename返回name所描述的文件名的目录部分。fileexecutablename返回文件是否可被执行。fileexistsname返回1表示文件存在,0表示文件不存在返回文件的扩展名。fileisdirectoryname判断是否为目录。fileisfilename判断是否为文件。fileIstatnamevarName以数组形式返回。执行lstat系统函数。存储在varNamefilemtimename文件的最近修改时间。fileownedname判断文件是否属于你。filereadablename判断文件是否可读。filereadlinkname都由符号连接的真正的文件名。file
22、rootnamename返回不包括最后一个点的字符串。filesizename返回文件的大小。filestatnamevarName调用stat内和调用,以数组形式存在varName中。返回最后一个斜线以后的部分。filetypename返回文件类型file,directory,characterspecial,blockSpecial,fifo,link,或socket。filewritablename判断文件是否可写。flushfileId立即处理由fileId描述的文件缓冲区。forstarttestnextbodyfor循环。同C总的一样。forseti1$i<10inc门put
23、s$iforeachvarnamelistbody类似于CShell总的foreach或bash中的rmatformatStringformatformatStringarg.格式化输由,类似于C中的sprintf。setaformat%s%dhello100/a=hello100getsfileIdgetsfileIdvarName从文件中读生一行。setfopen/etc/passwdrgets$fglobfilename.glob-nocomplainfilename.使用CShell风格的文件名通配规则,Mfilename进行扩展ls/tmpabctclsh>gl
24、ob/tmp/*abc当加上参数-nocomplain时,如文件列表为空则发生一个错误。globalvarname.定义全局变量。iftesttrueBodyiftesttrueBodyfalseBodyiftestthentrueBodyiftestthentrueBodyelsefalseBody条件判断,是在没什么说的。incrvarNameincrvarNameincrement如果没有incremnet,将varName加一,反之将varName加上incrementseti10incri/i=11incri10/i=21infosubcommandinfosubcommandarg
25、.取得当前的Tcl解释器的状态信息。infoargsprocname返回由procname指定的命令(你自己创建的)的参数列表如:procffabcputshahainfoargsff/returnabcinfobodyprocname返回由procname指定的命令(你自己创建的)的函数体。如:procffabcputshahainfobodyff/returnputshahainfocmdcount返回当前的解释器已经执行的命令的个数。infocommandsinfocommandspattern如果不给由模式,返回所有的命令的列表,内建和自建的。模式是用CShell匹配风格写成的。inf
26、ocompletecommand检查名是否完全,有无错误。infodefaultprocnameargvarnameprocname的参数arg,是否有缺省值。infoexistsvarName判断是否存在该变量。infoglobalsinfoglobalspattern返回全局变量的列表,模式同样是用CShell风格写成的。infohostname返回主机名。infolevelinfolevelnumber如果不给参数number则返回当前的在栈中的绝对位置,参见uplevel中的描述。如加了参数number,则返回一个列表包含了在该level上的命令名和参数。infolibrary返回标准
27、的Tcl脚本的可的路径。实际上是存在变量tcl_library中。infolocalsinfolocalspattern返回locale列表。infoprocsinfoprocspattern返回所有的过程的列表。infoscript返回最里面的脚本(用source来执行)的文件名infotclversion返回Tcl的版本号。infovarsinfovarspattern返回当前可见的变量名的列表。下面是一些用于列表的命令,范围可以是end。joinlistjoinlistjoinString将列表的内容连成一个字符串。lappendvarNamevalue.将value加入列表varNam
28、e中。lindexlistindex将list视为一个列表,返回其中第index个。列表中的第一个元素下标是0。lindex0001112221111linsertlistindexelement.在列表中的index前插入element。listarg.将所有的参数发在一起产生一个列表。listfridayexeclsexeccat/etc/passwdllengthlist返回列表中元素的个数。setllistsdfjsdfjhsdfsdkfjllength$l/return3lrangelistfirstlast返回列表中从frist至1Jlast之间的所有元素。setllist0001
29、11222333444555lrange$l3end/return333444555lreplacelistfirstlastIreplacelistfirstlastelement.替换列表中的从first到last的元素,用elementsetllist000111222333444555lreplace$l12dklfjsdfsdfdsfjhjdsf000dklfjsdfsdfdsfjhjdsf333444555-1Olsearch-modelistpattern在列表中搜索pattern,成功返回序号,找不到返回-mode:-exact精确-globshell的通配符-regexp正贝
30、U表达式lsearch111222333444111/return0lsearch111222333444uwe/return1lsort-modelist排列列表。-mode:-ascii-dictionary与acsii类似,只是不区分大小写-integer转化为整数再比较-real转化为浮点数再比较-commandcommand执行command来做比较openfileNameopenfileNameaccess打开文件,返回一个文件描述符accessrwar+w+a+定义与C中相同。如文件名的第一个字符为|表示一管道的形式来打开。setfopen|morewsetfopen/etc/p
31、assrprocnameargsbody创建一个新的过程,可以替代任何存在的过程或命令。procwffilestrputs-nonewline$filestrflush$filesetfopen/tmp/awwf$ffirstlinenwf$fsecondlinen在函数末尾可用return来返回值。puts-nonewlinefileIdstring向fileId中写入string,如果不加上-nonewline则自动产生一个换行符。pwd返回当前目录。readfileldreadfileldnumBytes从fileld中读取numBytes个字节。regexp?switches?exps
32、tring?matchVar?subMatchVarsubMatchVar.?执行正则表达式的匹配。switches?-nocase不区分大小写-indices返回匹配区间如:regexpAabcabcjsdfh/return1regexpAabcabcjsdfha/return1puts$a/returnabcregexp-indicesAabcabcsdfjkhsdfa/return1puts$a/return02regsub?switchs?expstringsubSpecvarName执行正则表达式的替换,用subSpec的内容替换string中匹配exp的部分。switchs?-al
33、l将所有匹配的部分替换,缺省子替换第一个,返回值为替换的个数。-nocase不区分大小写。如:regsubabcabcabcbaceeeb/return1puts$b/returneeeabcabcregsub-allabcabcabcabceeeb/return3puts$b/returneeeeeeeeereturn立即从当前命令中返回。procffreturnfridaysetaff/a=fridayscanstringformatvarname.从string中安format来读取值到varname。seekfileIdoffset?origin?移动文件指针。origin:start
34、currentendoffset从哪里开始算起。setvarname?value?设置varname用value,或返回varname的值。如果不是在个proc命令中则生成一个全局变量。sourcefileName从filename中读由内容传给Tcl解释起来执行。splitstring?splitChars?将string分裂成列表。缺省以空白为分隔符,也可通过splitChars来设定分隔符stringsubcommandarg.用于字符串的命令。stringcomparestring1string2执行字符串的比较,按Cstrcmp的方式。返回-1,0,or1stringfirststr
35、ing1string2在stringl种查找string2的定义次由现的位置。未找到返回-1Ostringlengthstring返回字符串string的长度。stringmatchpatternstring判断string是否能匹配pattern。pattern是以shell文件名的统配格式来给由。stringrangestringfirstlast返回字符串string中从first到last之间的内容。stringtolowerstring将string转换为小写。stringtoupperstring将string转换为大写。stringtrimstring将string的左右空白去掉
36、。stringtrimleftstring将string的左空白去掉。stringtrimrightstring将string的右空白去掉。tellfileld返回fileId的文件指针位置。timecommand执行命令,并计算所消耗的时间。timels-colorsomefilename503microsecondsperiterationtracesubcommandtracesubcommandarg.监视变量的存储。子命令定义了不少,但目前只实现了virable。tracevariablenameopscommandname为变量的名字。ops为要监视的操作。r读w写uunsetco
37、mmand条件满足时执行的命令。以三个参数来执行name1name2opsname1时变量的名字。当name1为矢量时,name2为下标,ops为执行的操作。例如:procffname1name2opputsformat%s%s%sname1name2op)setahhhtracevariablearffputs$a/returnarnhhhunknowncmdNameunknown并不是Tcl的一部分,当Tcl发现一条不认识的命令时会看看是否存在unknown命令,如果有,则调用它,没有则由错。如:#!/usr/bin/tclshprocunknowncwdargsputs$cwdputs$
38、args下面是一条错误命令sdfdfsdfsdkhfsdjkfhkasdfjksdhfk/returnsdfdfsdfsdkhfsdjkfhkasdfjksdhfkunsetname.删除一个或多个变量(标量或矢量)。uplevelcommand.将起参数连接起来(象是在concat中)。最后在由level所指定的上下文中来执行。如果level是一个整数,给由了在栈中的距离(是跳到其它的命令环境中来执行)。缺省为1(即上一层)。如:#!/usr/bin/tclprocffsetaff/设置了局部的asetaglobalffputs$a/returnglobal再看下一个:#!/usr/bin/tclprocffuplevelsetaff/改变上一级栈中的a)setaglobalffputs$a/returnff如果level是以#开头后接一个整数,则level指由了在栈中的绝对位置。如#0表示了顶层
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养老机构社交活动合同
- 养老机构心理咨询服务合同
- 对外经济合作保险担保协议
- 批发买卖合同
- 咨询项目合作协议
- 某三甲医院门户系统建设方案
- 网站加载速度优化合同
- 质量管理思想史
- 井下透水事故现场处置方案
- 工程砌墙招投标代理合同
- 旺角城广场商铺招商代理协议书
- 英语书写标准三线格可A4纸双面打印
- 《基础会计学》教案(共70页)
- 自己编制的表格-两孔箱涵(结构、配筋、裂缝、基底应力)箱涵结构计算(恒载+活载)
- 小型雕刻机结构设计说明书
- 小流量多头泵中文说明书C
- 最高法裁定:已付全款但尚未过户的商品房可以对抗该房抵押权
- 管理经济学计算题及参考答案(已分类整理)
- 自喷漆(环氧乙烷)化学品安全技术说明书(MSDS)
- 全省各市及县(市)城镇土地使用税地段等级划分及税额标准
- cpk原始数据生成器
评论
0/150
提交评论