Tcl語言快速參考手冊教學提綱_第1頁
Tcl語言快速參考手冊教學提綱_第2頁
Tcl語言快速參考手冊教學提綱_第3頁
Tcl語言快速參考手冊教學提綱_第4頁
Tcl語言快速參考手冊教學提綱_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。Tcl語言快速參考手冊-Tcl(ToolCommandLanguage,即工具命令語言;Tcl念作tickle即“踢叩”)是一種簡單易用易于擴展的嵌入式腳本語言,主要用于發(fā)布命令給交互式程序(如文本編輯器、調(diào)試器),及完成自動化批處理工作。Tcl語言不同于其他語言的最大的特點是:Tcl程序由Tcl命令序列組成,其每條語句都是一條指令。由于其極易擴展的特性,Tcl有大量的用C/C+編寫的擴展用于提供Tcl本身不具有的功能。其中使用最廣泛的擴展是TK,TK提供了各種OS平臺下的圖形用戶界面GUI(連強大的P

2、ython語言都不單獨提供自己的GUI,而是提供接口適配到TK上)。另一個流行的擴展包是Expect,它提供了通過終端自動執(zhí)行命令的能力,例如passwd,ftp,telnet等命令驅(qū)動的外殼。一、Tcl程序基本結(jié)構(gòu)1、基本語法Tcl的語法類似于shell:一條Tcl的命令串包含若干條命令,命令使用換行符或分號來隔開;而每一條命令包含若干個域(field),域使用空白(空格或TAB)來隔開第一個域是命令的名字,其它的域是該命令的參數(shù)。Tcl解釋器對一個命令的執(zhí)行過程分為兩步:分析階段和執(zhí)行階段。在分析階段,Tcl解釋器運用規(guī)則識別出命令并把命令分成一個個獨立的單詞,同時進行必要的置換(subs

3、titution);在執(zhí)行階段,Tcl解釋器會把第一個單詞當作命令名,并查看這個命令是否有定義,如果有定義就激活這個命令對應的C/C+過程,并把所有后面的單詞作為參數(shù)傳遞給該命令過程,讓命令過程進行處理。Tcl解釋器既可以執(zhí)行Tcl內(nèi)建命令亦可執(zhí)行用戶自己通過C/C+函數(shù)實現(xiàn)的新建命令,在應用程序中可用函數(shù)Tcl_CreateCommand來完成命令的創(chuàng)建。所有命令參數(shù)都被作為字符串來傳遞,命令自己會按其所需來解釋參數(shù)。另外關于Tcl的注釋有一個特殊的要求:必須出現(xiàn)在Tcl解釋器期望命令的第一個字符出現(xiàn)的地方,才被當作注釋。例如:seta100#Notacommentsetb101;#this

4、isacomment第一個例子中#及其后面的內(nèi)容會被當作set的參數(shù)而非注釋從而導致參數(shù)個數(shù)錯誤;但第二個被解釋為注釋,因為#前面有一個分號,而分號和換行一樣被看作是命令的分隔符。2、置換(Substitution)setx10sety100+x上面命令執(zhí)行后,y的值是“100+x”而不是我們期望的110。這是因為Tcl解釋器在分析命令時,把所有的命令參數(shù)都當作字符串看待,所以x被看作了字符串“100+x”的一部分。如果我們想使用x的值10,就必須告訴Tcl解釋器:我們在這里期望的是變量x的值,而非字符x。那么怎么告訴Tcl解釋器呢?這就要用到Tcl語言中的置換功能。Tcl提供三種形式的置換:

5、變量置換、命令置換和反斜杠置換。每種置換都會導致一個或多個單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內(nèi)的每一個單詞中,而且置換可以嵌套。(1)變量置換(variablesubstitution)變量置換由一個符號標記,變量置換會導致變量的值而非變量(標識符)本身被插入到字符串中。setx10sety100+$x這時,y的值還不是我們想要的值110,而是10+100,因為Tcl解釋器把10+100看成是一個字符串而不是表達式;y要想得到值110,還必須用命令置換,使得Tcl會把10+100看成一個表達式并求值。(2)命令置換(commandsubstitution)命令置換是由括起來的

6、Tcl命令及其參數(shù),命令置換會導致某一個命令的所有或部分單詞(參數(shù))被另一個命令的結(jié)果所代替。setx10setyexpr100+$x這時,y的值就是110了。這里當Tcl解釋器遇到字符時,它就會把隨后的expr作為一個命令名,從而激活與expr對應的C/C+過程,并把expr命令中變量置換后得到的10+110傳遞給該命令過程進行處理。有了命令置換,實際上就表示命令之間是可以嵌套的,即一個命令的結(jié)果可以作為別的命令的參數(shù)。注意,中必須是一個合法的Tcl腳本,長度不限。中腳本的值為最后一個命令的返回值。(3)反斜杠置換(backslashsubtitution)Tcl語言中的反斜杠置換類似于C語

7、言中反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、$等被Tcl解釋器當作特殊符號對待的字符。例如:setmsgmultiplespace如果沒有的話,Tcl會報錯,因為解釋器會把這里最后兩個單詞之間的空格認為是分隔符,于是發(fā)現(xiàn)set命令有多于兩個參數(shù),從而報錯。加入了后,空格不被當作分隔符,multiplespace被認為是一個單詞(word)。(4)雙引號和花括號除了使用反斜杠外,Tcl提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當作普通字符,而不作特殊處理,這就要使用雙引號和花括號()。Tcl解釋器對雙引號中的各種分隔符將不作處理,但是對換行符及和兩種置換符會照常處理。

8、而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,Tcl解釋器不會對其作特殊處理。二、Tcl變量數(shù)據(jù)類型Tcl只支持一種數(shù)據(jù)類型:字符串(string)。所有的命令,命令的所有的參數(shù),命令的結(jié)果,所有的變量都是字符串。請牢記這一點,所有的東西都是字符串(然而字符串的實際解釋是依賴于其所處上下文,共有三種解釋:命令,表達式和表)。(1)簡單變量一個Tcl的簡單變量包含兩個部分:名字和值,其中名字和值都可以是任意字符串。不過為了更好的使用變量置換功能,變量名最好按CC+語言中標識符的命名規(guī)則命名。這是因為Tcl解釋器在分析一個變量置換時,只把從符號往后直到第一個不是字母、數(shù)字或下劃線的字

9、符之間的單詞符號作為要被置換的變量的名字。例如:seta2seta.15setb$a.1在最后一個命令行,我們希望把變量a.1的值付給b,但是Tcl解釋器在分析時只把$符號之后直到第一個不是字母、數(shù)字或下劃線的字符(這里是.)之間的單詞符號(這里是a)當作要被置換的變量的名字,所以Tcl解釋器把a置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。當然,如果變量名中有不是字母、數(shù)字或下劃線的字符又要用變量置換,可以用花括號把變量名括起來。例如:setb$a.1(2)數(shù)組變量數(shù)組是一些元素的集合。Tcl的數(shù)組和一般編程語言中的數(shù)組有很大的區(qū)別。在Tcl中,不能單獨聲明一個數(shù)組,數(shù)

10、組只能和數(shù)組元素一起聲明。數(shù)組中數(shù)組元素的名字包含兩部分:數(shù)組名和數(shù)組中元素的名字,Tcl中數(shù)組元素的名字(下標可以為任何字符串。例如:setday(monday)1setday(sunday)2(3)string結(jié)構(gòu)及其操作因為TCL把所有的輸入都當作字符串看待,所以TCL提供了較強的字符串操作功能【format】語法:formatformatstringvluevalue.format命令類似于ANSIC中的sprintf函數(shù),它按formatstring提供的格式,把各個value的值組合到forma-tstring中形成一個新字符串并返回。例如:setmsgformat%sis%dye

11、arsold$name$age【scan】語法:scanstringformatstingvarNamevarName.scan命令可以認為是format命令的逆,其功能類似于ANSIC中的sscanf函數(shù)。它按formatsting提供的格式分析string字符串,然后把結(jié)果存到變量varName中,注意除了空格和TAB鍵之外,string和formatsting中的字符和%必須匹配。例如:scansome2634some%d%dab【regexp】語法:regexpswitchs-expstringmatchVarsubMatchVarsubMatchVar.regexp命令用于判斷正規(guī)表

12、達式exp是否全部或部分匹配字符串string,匹配返回1,否則0。regexp可以設置一些開關(switchs,來控制匹配的具體方式,如:-nocase,-line等,其中-表示這后面再沒有開關(switchs了,即使后面有以-開頭的參數(shù)也被當作正規(guī)表達式的一部分。如果regexp命令后面有參數(shù)matchVar和subMatchVar,則所有的參數(shù)被當作變量名,如果變量不存在,就會被生成。regexp把匹配整個正規(guī)表達式的子字符串賦給第一個變量,匹配正規(guī)表達式的最左邊的子表達式的子字符串賦給第二個變量,依次類推,例如:regexp(0-9+)*(a-z+)thereis100applesto

13、talnumwordputs$total,$num,$word顯示結(jié)果為:100apples,100,apples【regsub】語法:regsubswitchsexpstringsubSpecvarnameregsub的第一個參數(shù)是一個正則表達式,第二個參數(shù)是一個輸入字符串,這一點和regexp命令完全一樣,也是當匹配時返回1,否則返回0。不過regsub用第三個參數(shù)的值來替換字符串string中和正規(guī)表達式匹配的部分,第四個參數(shù)被認為是一個變量,替換后的字符串存入這個變量中。例如:regsubthereTheylivetherelivestheirxputs$x顯示結(jié)果為:Theylive

14、theirlives【sting】語法:stringsubcmdargarg.string命令具有強大的操作字符串的功能,并通過其中的subcmd來區(qū)別具體想要執(zhí)行的具體操作。他們中的一些如下:stringlengthstringstringrangestringfirstlaststringindexstringcharIndexstringtolowerstringfirstlaststringreplacestringfirstlastnewstringstringequal-nocase-lengthintstring1string2stringmatch-nocasepatterns

15、tring如果pattern匹配string,那么返回1,否則返回0.stringcompare-nocase-lengthintstring1string2如果有-length參數(shù),那么只比較前int個字符stringfirststring1string2startindex在string2中從頭查找與string1匹配的字符序列,如果找到,那么就返回匹配的第一個字母所在的位置(0-based)。如果沒有找到,那么返回-1。stringtrimstringchars返回值為:從string字符串的首尾刪除掉了字符集合chars中的字符后的字符串。如果沒有給出chars,那么將刪除掉space

16、s、tabs、newlines、carriagereturns這些字符.(4)list結(jié)構(gòu)及其操作list這個概念在TCL中是用來表示集合的。TCL中l(wèi)ist是由一堆元素組成的有序集合,list可以嵌套定義,list每個元素可以是任意字符串,也可以是list。Tcl提供了很多基本命令對list進行操作?!緇ist】語法:listvaluevalue.這個命令生成一個list,list的元素就是所有的value?!綾oncat】語法:concatlistlist.這個命令把多個list合成一個list?!緇length】語法:llengthlist返回list的元素個數(shù)?!緇index】語法:l

17、indexlistindex返回list的第index個(0-based)元素?!緇range】語法:lrangelistfirstlast返回list的第first(0-based)到第last(0-based)元素組成的串,如果last的值是end。就是從第first個直到串的最后?!緇insert】語法:linsertlistindexvaluevalue.?返回一個新串,新串是把所有的value參數(shù)值插入list的第index個(0-based)元素之前得到?!緇append】語法:lappendvarnamevaluevalue.?把每個value的值作為一個元素附加到變量varna

18、me后面,并返回變量的新值,如果varname不存在,就生成這個變量。【lreplace】語法:lreplacelistfirstlastvaluevalue.返回一個新串,新串是把list的第firs(0-based)t到第last個(0-based)元素用所有的value參數(shù)替換得到的。如果沒有value參數(shù),就表示刪除第first到第last個元素?!緇sort】語法:lsortoptions?list這個命令返回把list排序后的串。options可以是如下值:-ascii按ASCII字符的順序排序比較.這是缺省情況。-dictionary按字典排序,與-ascii不同的地方是:(1)

19、不考慮大小寫(2)如果元素中有數(shù)字的話,數(shù)字被當作整數(shù)來排序.【lsearch】語法:lsearch-optionlistpattern返回list中第一個匹配模式pattern的元素的索引,如果找不到匹配就返回-1。option取-exact、-glob、-regexp是三種模式匹配的技術(shù),缺省時使用-glob匹配。【join】語法:joinlistjoinString這個命令把list的所有元素合并到一個字符串中,中間以joinString分開。缺省的joinString是空格?!緎plit】語法:splitstringsplitChars把字符串string按分隔符splitChars分

20、成一個個單詞,返回由這些單詞組成的串。如果splitChars是一個空字符,string被按字符分開。如果splitChars沒有給出,以空格為分隔符。(5)file結(jié)構(gòu)及其操作TCL提供了豐富的文件操作的命令。通過這些命令你可以對文件名進行操作(查找匹配某一模式的文件)、以順序或隨機方式讀寫文件、檢索系統(tǒng)保留的文件信息(如最后訪問時間)?;疚募蘒/Opwd和UNIX下的pwd命令完全一樣,沒有參數(shù),返回當前目錄的完整路徑。cd命令也和UNIX命令也一樣,使用一個參數(shù),可以把工作目錄改變?yōu)閰?shù)提供的目錄。以下這個名為tgrep的過程,可以說明TCL文件I/O的基本特點:proctgreppa

21、tternfilenamesetfopen$filenamerwhilegets$flineifregexp$pattern$lineputsstdout$lineclose$fopen命令返回一個字符串用于表識打開的文件。當調(diào)用別的命令(如:gets,puts,close,對打開的文件進行操作時,就可以使用這個文件標識符。TCL有三個特定的文件標識:stdin,stdout和stderr,分別對應標準輸入、標準輸出和錯誤通道,任何時候你都可以使用這三個文件標識。隨即文件訪問默認文件輸入輸出方式是連續(xù)的:即每個gets或read命令返回的是上次gets或read訪問位置后面的字節(jié),每個puts

22、命令寫數(shù)據(jù)是接著上次puts寫的位置接著寫。TCL提供了seek,tell和eof等命令使用戶可以非連續(xù)訪問文件。每個打開的打開文件都有訪問點,即下次讀寫開始的位置。文件打開時,訪問點總是被設置為文件的開頭或結(jié)尾,這取決于打開文件時使用的訪問模式。每次讀寫后訪問位置按訪問的字節(jié)數(shù)后移相應的位數(shù)。seekfileIdoffsetorigin把fileId標識的文件的訪問點設置為相對于origin偏移量為offset的位置。origin可以是start,current,end,默認是start。tellfileId返回fileId標識的文件的當前訪問位置。eoffileId如果到達fileId標識

23、的文件的末尾返回1,否則返回0。文件操作和獲取文件信息【grob】語法:globswitchespatternpattern.glob命令的模式采用stringmatch命令的匹配規(guī)則,返回匹配這個(些)模式的所有文件的列表。例如:glob*.c*.hglob*/只返回當前目錄的所有子目錄?!緁ile】語法:filesubcmdargarg.file通過眾多的subcmd子操作提供強大的文件操作和訪問能力。他們中的一些如下:fileexistsnamefileextensionnamefilemkdirdirdir.filecopy-force-sourcetargetfilerename-f

24、orce-sourcetargetfiledelete-force-pathnamepathname.三、Tcl表達式(1)操作數(shù)Tcl表達式的操作數(shù)通常是整數(shù)或?qū)崝?shù)。整數(shù)一般是十進制的,但如果整數(shù)前兩個字符是0 x則這個整數(shù)被看作是十六進制的。Tcl的實數(shù)的寫法與ANSIC中完全一樣。(2)運算符Tcl中的運算符的語法形式和用法跟ANSIC中完全一致。另外,Tcl中提供了大量的常用數(shù)學函數(shù)來增強自身的數(shù)學運算和處理能力,這些函數(shù)的形式和用法大都與ANSIC中的數(shù)學函數(shù)完全一致。四、Tcl流程控制TCL中的控制流和C語言類似,包括if、switch、for、while、foreach、brea

25、k、continue等命令。(1)條件語句if$x0.elseif$x1.elseif$x2.else.注意,上例中一定要寫在上一行,因為如果不這樣,TCL解釋器會認為if命令在換行符處已結(jié)束,下一行會被當成新的命令,從而導致錯誤的結(jié)果。在Tcl的其他流程控制命令的書寫中也要注意這個問題。書寫中還要注意的一個問題是if和之間應該有一個空格,否則TCL解釋器會把if作為一個整體當作一個命令名,從而導致錯誤。switchoption$xa-bincrt1cincrt2defaultincrt3其中可選參數(shù)option,表示進行匹配的方式。TCL支持三種匹配方式:-exact方式,-glob方式,-

26、regexp方式,缺省情況表示-glob方式。-exact方式表示的是精確匹配,-glob方式的匹配方式和stringmatch命令的匹配方式相同,-regexp方式是正規(guī)表達式匹配方式。條件中a的后面跟一個表示使用和下一個模式相同的腳本,default表示匹配任意值。一旦switch命令找到一個模式匹配,就執(zhí)行相應的腳本,并返回腳本的值作為switch命令的返回值。(2)循環(huán)語句forinittestreinitbody參數(shù)init是一個初始化腳本,第二個參數(shù)test是一個表達式,用來決定循環(huán)什么時候中斷,第三個參數(shù)reinit是一個重新初始化的腳本,第四個參數(shù)body也是腳本。如:setbforsetiexprllength$a-1$i=0incri-1lappendblindex$a$iwhile的例子假設變量a是一個鏈表,下面的腳本把a的值復制到b:setbsetiexprllength$a-1while$i=0lappendblindex$a$iincri-1foreach命令的兩種形式:1、foreachvarNamelistbody第一個參數(shù)varName是一個變量,第二個參數(shù)list是一個表(有序集合),第三個參數(shù)body是循環(huán)體。每次取得鏈表的一個元素,都會執(zhí)行循環(huán)體一次。如:setbforeachi$ase

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論