




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。TCL培訓(xùn)教程全深圳市華為技術(shù)有限公司研究管理部文檔中心文檔編號產(chǎn)品版本密級產(chǎn)品名稱:測試平臺共numpages*MERGEFORMAT60頁TCL培訓(xùn)教程(全)(僅供內(nèi)部使用)擬制:陳旭盛日期:2000/12/08審核:日期:yyyy/mm/dd審核:日期:yyyy/mm/dd批準(zhǔn):日期:yyyy/mm/dd深圳市華為技術(shù)有限公司版權(quán)所有侵權(quán)必究修訂記錄用于說明對文檔加附頁或文檔版本升級時對文檔的改動情況,一般設(shè)計類文檔日期修訂版本描述作者2000/12/082.00初稿完成陳旭盛目錄1引言62語法7
2、2.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數(shù)組113.3相關(guān)命令113.3.1set113.3.2unset113.3.3append和incr124表達式124.1操作數(shù)124.2運算符和優(yōu)先級124.3數(shù)學(xué)函數(shù)135List145.1list命令145.2concat命令:145.3lindex命令155
3、.4llength命令155.5linsert命令155.6lreplace命令:155.7lrange命令:155.8lappend命令:155.9lsearch命令:165.10lsort命令:165.11split命令:165.12join命令176控制流176.1if命令176.2循環(huán)命令:while、for、foreach176.2.1while命令176.2.2for命令186.2.3foreach命令186.2.4break和continue命令196.2.5switch命令196.1eval命令196.2source命令197過程(procedure)207.1過程定義和返回值
4、207.2局部變量和全局變量207.3缺省參數(shù)和可變個數(shù)參數(shù)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、.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.1
6、3stringtrimstring?chars?278.5.14stringtrimleftstring?chars?278.5.15stringtrimrightstring?chars?279文件訪問289.1文件名289.2基本文件輸入輸出命令289.3隨機文件訪問299.4當(dāng)前工作目錄309.5文件操作和獲取文件信息3010錯誤和異常3310.1錯誤3310.2從TCL腳本中產(chǎn)生錯誤3410.3使用catch捕獲錯誤3510.4其他異常3511深入TCL3711.1查詢數(shù)組中的元素3711.2info命令3811.2.1變量信息3811.2.2過程信息3911.2.3命令信息4011.
7、2.4TCL的版本和庫4111.2.5命令的執(zhí)行時間4111.2.6跟蹤變量4111.2.7命令的重命名和刪除4311.2.8unknown命令4411.2.9自動加載4412歷史記錄4513TCL和CC+4713.1生成自己的TCLSH4813.2擴展自己的命令:方法(一)4813.2.1編寫擴展命令對應(yīng)的C/C+過程4813.2.2注冊命令4913.2.3命令返回值和命令對應(yīng)的過程的返回值5013.3擴展自己的命令:方法(二)5213.3.1Tcl_Obj結(jié)構(gòu)5213.3.2編寫擴展命令對應(yīng)的C/C+過程5413.3.3注冊命令5413.4利用clientData參數(shù)和deleteProc
8、參數(shù)5513.5在C/C+應(yīng)用程序中嵌入TCL5814總結(jié)59TCL培訓(xùn)教程(全)關(guān)鍵詞:TCL摘要:本文是TCL教材的第三稿,前兩稿分別是TCL的使用和TCL培訓(xùn)教程。這一稿加入了不少內(nèi)容,是北研TCL興趣小組共同努力的結(jié)果。本文詳細介紹了TCL的各個方面,特別對利用CC+語言擴展TCL命令作了詳細論述。本文附有大量實例??s略語清單:TCLToolCommandLanguage一種腳本語言參考資料清單:請在表格中羅列本文檔所引用的有關(guān)參考文獻名稱、作者、標(biāo)題、編號、發(fā)布日期和出版單位等基本信息。參考資料清單名稱作者編號發(fā)布日期查閱地點或渠道出版單位(若不為本公司發(fā)布的文獻,請?zhí)顚懘肆校㏕cl
9、andTkToolKitJohnK.Ousterhout98123595161999自己的圖書AddisonWesleyPublishingCommpanyTCL的使用陳旭盛自寫文檔TCL培訓(xùn)教程陳旭盛自寫文檔引言TCL(ToolCommandLanguage)是一種解釋執(zhí)行的腳本語言(ScriptingLanguage)。它提供了通用的編程能力:支持變量、過程和控制結(jié)構(gòu);同時TCL還擁有一個功能強大的固有的核心命令集。由于TCL的解釋器是用一個CC+語言的過程庫實現(xiàn)的,因此在某種意義上我們又可以把TCL看作一個C庫,這個庫中有豐富的用于擴展TCL命令的CC+過程和函數(shù),可以很容易就在CC+應(yīng)
10、用程序中嵌入TCL,而且每個應(yīng)用程序都可以根據(jù)自己的需要對TCL語言進行擴展。我們可以針對某一特定應(yīng)用領(lǐng)域?qū)CL語言的核心命令集進行擴展,加入適合于自己的應(yīng)用領(lǐng)域的擴展命令,如果需要,甚至可以加入新的控制結(jié)構(gòu),TCL解釋器將把擴展命令和擴展控制結(jié)構(gòu)與固有命令和固有控制結(jié)構(gòu)同等看待。擴展后的TCL語言將可以繼承TCL核心部分的所有功能,包括核心命令、控制結(jié)構(gòu)、數(shù)據(jù)類型、對過程的支持等。根據(jù)需要,我們甚至可以屏蔽掉TCL的某些固有命令和固有控制結(jié)構(gòu)。通過對TCL的擴展、繼承或屏蔽,用戶用不著象平時定義一種計算機語言那樣對詞法、語法、語義、語用等各方面加以定義,就可以方便的為自己的應(yīng)用領(lǐng)域提供一種
11、功能完備的腳本語言。TCL良好的可擴展性使得它能很好地適應(yīng)產(chǎn)品測試的需要,測試任務(wù)常常會由于設(shè)計和需求的改變而迅速改變,往往讓測試人員疲于應(yīng)付。利用TCL的可擴展性,測試人員就可以迅速繼承多種新技術(shù),并針對產(chǎn)品新特點迅速推出擴展TCL命令集,以用于產(chǎn)品的測試中,可以較容易跟上設(shè)計需求的變化。另外,因為TCL是一種比CC+語言有著更高抽象層次的語言,使用TCL可以在一種更高的層次上編寫程序,它屏蔽掉了編寫CC+程序時必須涉及到的一些較為煩瑣的細節(jié),可以大大地提高開發(fā)測試?yán)乃俣?。而且,使用TCL語言寫的測試?yán)_本,即使作了修改,也用不著重新編譯就可以調(diào)用TCL解釋器直接執(zhí)行??梢允s不少時間。T
12、CL目前已成為自動測試中事實上的標(biāo)準(zhǔn)。語法簡單的講,TCL語言的語法實際上是一些TCL解釋器怎樣對TCL命令進行分析的規(guī)則的集合。腳本、命令和單詞符號一個TCL腳本可以包含一個或多個命令。命令之間必須用換行符或分號隔開,下面的兩個腳本都是合法的:seta1setb2或seta1;setb2TCL的每一個命令包含一個或幾個單詞,第一個單詞代表命令名,另外的單詞則是這個命令的參數(shù),單詞之間必須用空格或TAB鍵隔開。TCL解釋器對一個命令的求值過程分為兩部分:分析和執(zhí)行。在分析階段,TCL解釋器運用規(guī)則把命令分成一個個獨立的單詞,同時進行必要的置換(substitution);在執(zhí)行階段,TCL解釋
13、器會把第一個單詞當(dāng)作命令名,并查看這個命令是否有定義,如果有定義就激活這個命令對應(yīng)的C/C+過程,并把所有的單詞作為參數(shù)傳遞給該命令過程,讓命令過程進行處理。置換(substitution)注:在下面的所有章節(jié)的例子中,為TCL的命令提示符,輸入命令回車后,TCL會在接著的一行輸出命令執(zhí)行結(jié)果。/后面是我自己加上的說明,不是例子的一部分。TCL解釋器在分析命令時,把所有的命令參數(shù)都當(dāng)作字符串看待,例如:%setx10/定義變量x,并把x的值賦為1010%setyx+100/y的值是x+100,而不是我們期望的110 x+100上例的第二個命令中,x被看作字符串x+100的一部分,如果我們想使用
14、x的值10,就必須告訴TCL解釋器:我們在這里期望的是變量x的值,而非字符x。怎么告訴TCL解釋器呢,這就要用到TCL語言中提供的置換功能。TCL提供三種形式的置換:變量置換、命令置換和反斜杠置換。每種置換都會導(dǎo)致一個或多個單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內(nèi)的每一個單詞中,而且置換可以嵌套。變量置換(variablesubtitution)變量置換由一個符號標(biāo)記,變量置換會導(dǎo)致變量的值插入一個單詞中。例如:%sety$x+100/y的值是10+100,這里x被置換成它的值1010100這時,y的值還不是我們想要的值110,而是10+100,因為TCL解釋器把10+100看成
15、是一個字符串而不是表達式,y要想得到值110,還必須用命令置換,使得TCL會把10+100看成一個表達式并求值。命令置換(commandsubstitution)命令置換是由括起來的TCL命令及其參數(shù),命令置換會導(dǎo)致某一個命令的所有或部分單詞被另一個命令的結(jié)果所代替。例如:%setyexpr$x+100110y的值是110,這里當(dāng)TCL解釋器遇到字符時,它就會把隨后的expr作為一個命令名,從而激活與expr對應(yīng)的C/C+過程,并把expr和變量置換后得到的10+110傳遞給該命令過程進行處理。如果在上例中我們?nèi)サ?,那么TCL會報錯。因為在正常情況下,TCL解釋器只把命令行中的第一個單詞作為看
16、作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。注意,中必須是一個合法的TCL腳本,長度不限。中腳本的值為最后一個命令的返回值,例如:%setyexpr$x+100;setb300/y的值為300,因為setb300的返回值為300300有了命令置換,實際上就表示命令之間是可以嵌套的,即一個命令的結(jié)果可以作為別的命令的參數(shù)。反斜杠置換(backslashsubstitution)TCL語言中的反斜杠置換類似于C語言中反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、$等被TCL解釋器當(dāng)作特殊符號對待的字符。例如:setmsgmultiplespace/msg的值為multipl
17、espace。如果沒有的話,TCL會報錯,因為解釋器會把這里最后兩個單詞之間的空格認為是分隔符,于是發(fā)現(xiàn)set命令有多于兩個參數(shù),從而報錯。加入了后,空格不被當(dāng)作分隔符,multiplespace被認為是一個單詞(word)。又例如:%setmsgmoney$3333nArraya2/這個命令的執(zhí)行結(jié)果為:money$3333Arraya2這里的$不再被當(dāng)作變量置換符。TCL支持以下的反斜杠置換:BackslashSequenceReplacedByaAudiblealert(0 x7)bBackspace(0 x8)fFormfeed(0 xc)nNewline(0 xa)rCarriage
18、return(0 xd)tTab(0 x9)vVerticaltab(0 xb)dddOctalvaluegivenbyddd(one,two,orthreeds)xhhHexvaluegivenbyhh(anynumberofhs)newlinespaceAsinglespacecharacter.例如:setax48/對應(yīng)xhhH/十六進制的48正好是72,對應(yīng)Hseta110/對應(yīng)dddH/八進制的110正好是72,對應(yīng)Hsetaexpr/對應(yīng)newlinespace,一個命令可以用newline轉(zhuǎn)到下一行繼續(xù)2+35雙引號和花括號除了使用反斜杠外,TCL提供另外兩種方法來使得解釋器把分
19、隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號和花括號()。TCL解釋器對雙引號中的各種分隔符將不作處理,但是對換行符及和兩種置換符會照常處理。例如:%setx100100%sety$xddd100ddd而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會對其作特殊處理。%sety/n$xexpr10+100/n$xexpr10+100注釋TCL中的注釋符是,和直到所在行結(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對注釋將不作任何處理。不過,要注意的是,必須出現(xiàn)在TCL解釋器期望命令的第一個字符出現(xiàn)的地方,才被當(dāng)作注釋。例如:%Thisisaco
20、mment%seta100#Notacommentwrong#args:shouldbesetvarName?newValue?%setb101;#thisisacomment101第二行中就不被當(dāng)作注釋符,因為它出現(xiàn)在命令的中間,TCL解釋器把它和后面的字符當(dāng)作命令的參數(shù)處理,從而導(dǎo)致錯誤。而第四行的就被作為注釋,因為前一個命令已經(jīng)用一個分號結(jié)束,TCL解釋器期望下一個命令接著出現(xiàn)?,F(xiàn)在在這個位置出現(xiàn)#,隨后的字符就被當(dāng)作注釋了。變量TCL支持兩種類型的變量:簡單變量和數(shù)組。簡單變量一個TCL的簡單變量包含兩個部分:名字和值。名字和值都可以是任意字符串。例如一個名為“13237&*:hdgg
21、的變量在TCL中都是合法的。不過為了更好的使用置換(substitution),變量名最好按CC+語言中標(biāo)識符的命名規(guī)則命名。TCL解釋器在分析一個變量置換時,只把從符號往后直到第一個不是字母、數(shù)字或下劃線的字符之間的單詞符號作為要被置換的變量的名字。例如:%seta22seta.144%setb$a.12.1在最后一個命令行,我們希望把變量a.1的值付給b,但是TCL解釋器在分析時只把$符號之后直到第一個不是字母、數(shù)字或下劃線的字符(這里是.)之間的單詞符號(這里是a)當(dāng)作要被置換的變量的名字,所以TCL解釋器把a置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。當(dāng)然,如果
22、變量名中有不是字母、數(shù)字或下劃線的字符,又要用置換,可以用花括號把變量名括起來。例如:%setb$a.14TCL中的set命令能生成一個變量、也能讀取或改變一個變量的值。例如:setakdfjkjdfkdfjkjdf如果變量a還沒有定義,這個命令將生成變量a,并將其值置為kdfjkjdf,若a已定義,就簡單的把a的值置為kdfjkjdf。setakdfjkjdf這個只有一個參數(shù)的set命令讀取a的當(dāng)前值kdfjkjdf。數(shù)組數(shù)組是一些元素的集合。TCL的數(shù)組和普通計算機語言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨聲明一個數(shù)組,數(shù)組只能和數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組
23、名和數(shù)組中元素的名字,TCL中數(shù)組元素的名字(下標(biāo)可以為任何字符串。例如:setday(monday)1setday(tuesday)2第一個命令生成一個名為day的數(shù)組,同時在數(shù)組中生成一個名為monday的數(shù)組元素,并把值置為1,第二個命令生成一個名為tuesday的數(shù)組元素,并把值置為2。簡單變量的置換已經(jīng)在前一節(jié)討論過,這里講一下數(shù)組元素的置換。除了有括號之外,數(shù)組元素的置換和簡單變量類似。例:setamondaysetday(monday)1setb$day(monday)/b的值為1,即day(monday)的值。setc$day($a)/c的值為1,即day(monday)的值。
24、TCL不能支持復(fù)雜的數(shù)據(jù)類型,這是一個很大的缺憾,也是TCL受指責(zé)很多的方面。但是TCL的一個擴展ITCL填補了這個缺憾。相關(guān)命令set這個命令在3.1已有詳細介紹。unset這個命令從解釋器中刪除變量,它后面可以有任意多個參數(shù),每個參數(shù)是一個變量名,可以是簡單變量,也可以是數(shù)組或數(shù)組元素。例如:%unsetabday(monday)上面的語句中刪除了變量a、b和數(shù)組元素day(monday),但是數(shù)組day并沒有刪除,其他元素還存在,要刪除整個數(shù)組,只需給出數(shù)組的名字。例如:%puts$day(monday)cantreadday(monday):nosuchelementinarray%p
25、uts$day(tuesday)2%unsetday%puts$day(tuesday)cantreadday(tuesday):nosuchvariableappend和incr這兩個命令提供了改變變量的值的簡單手段。append命令把文本加到一個變量的后面,例如:%settxthellohello%appendtxt!Howareyouhello!Howareyouincr命令把一個變量值加上一個整數(shù)。incr要求變量原來的值和新加的值都必須是整數(shù)。%setbaa%incrbexpectedintegerbutgota%setb22%incrb35表達式TCL中的表達式類似于ANSIC的表
26、達式。表達式由操作數(shù)和操作符構(gòu)成,下面分別介紹。操作數(shù)TCL表達式的操作數(shù)通常是整數(shù)或?qū)崝?shù)。整數(shù)一般是十進制的,但如果整數(shù)的第一個字符是0(zero),那么TCL將把這個整數(shù)看作八進制的,如果前兩個字符是0 x則這個整數(shù)被看作是十六進制的。TCL的實數(shù)的寫法與ANSIC中完全一樣。如:2.17.9e+126e43.運算符和優(yōu)先級下面的表格中列出了TCL中用到的運算符,它們的語法形式和用法跟ANSIC中很相似。這里就不一一介紹。下表中的運算符是按優(yōu)先級從高到低往下排列的。同一格中的運算符優(yōu)先級相同。語法形式結(jié)果操作數(shù)類型-a!aa負a非aint,floatint,floatinta*ba/ba%
27、b乘除取模int,floatint,floatinta+ba-b加減int,floatint,floatab左移位右移位intintaba=b小于大于小于等于大于等于int,float,stringint,float,stringint,float,stringint,float,stringa=ba!=b等于不等于int,float,stringint,float,stringa&b位操作與intab位操作異或inta|b位操作或inta&b邏輯與int,floata|b邏輯或int,floata?b:c選擇運算a:int,float數(shù)學(xué)函數(shù)TCL支持常用的數(shù)學(xué)函數(shù),表達式中數(shù)學(xué)函數(shù)的寫法類
28、似于CC+語言的寫法,數(shù)學(xué)函數(shù)的參數(shù)可以是任意表達式,多個參數(shù)之間用逗號隔開。例如:%setx22%expr2*sin($x0elseif$x1elseif$x2else注意,上例中一定要寫在上一行,因為如果不這樣,TCL解釋器會認為if命令在換行符處已結(jié)束,下一行會被當(dāng)成新的命令,從而導(dǎo)致錯誤的結(jié)果。在下面的循環(huán)命令的書寫中也要注意這個問題。書寫中還要注意的一個問題是if和之間應(yīng)該有一個空格,否則TCL解釋器會把if作為一個整體當(dāng)作一個命令名,從而導(dǎo)致錯誤。循環(huán)命令:while、for、foreachwhile命令語法為:whiletestbody參數(shù)test是一個表達式,body是一個腳本
29、,如果表達式的值非0,就運行腳本,直到表達式為0才停止循環(huán),此時while命令中斷并返回一個空字符串。例如:假設(shè)變量a是一個鏈表,下面的腳本把a的值復(fù)制到b:setbsetiexprllength$a-1while$i=0lappendblindex$a$iincri-1for命令語法為:forinittestreinitbody參數(shù)init是一個初始化腳本,第二個參數(shù)test是一個表達式,用來決定循環(huán)什么時候中斷,第三個參數(shù)reinit是一個重新初始化的腳本,第四個參數(shù)body也是腳本,代表循環(huán)體。下例與上例作用相同:setbforsetiexprllength$a-1$i=0incri-1
30、lappendblindex$a$iforeach命令這個命令有兩種語法形式1。foreachvarNamelistbody第一個參數(shù)varName是一個變量,第二個參數(shù)list是一個表(有序集合),第三個參數(shù)body是循環(huán)體。每次取得鏈表的一個元素,都會執(zhí)行循環(huán)體一次。下例與上例作用相同:setbforeachi$asetblinsert$b0$i2。foreachvarlist1list1?varlist2list2.?Body這種形式包含了第一種形式。第一個參數(shù)varlist1是一個循環(huán)變量列表,第二個參數(shù)是一個列表list1,varlist1中的變量會分別取list1中的值。body參
31、數(shù)是循環(huán)體。?varlist2list2.?表示可以有多個變量列表和列表對出現(xiàn)。例如:setxforeachijabcdeflappendx$j$i這時總共有三次循環(huán),x的值為badcfe。setxforeachiabcjdefglappendx$i$j這時總共有四次循環(huán),x的值為adbecfg。setxforeachiabcjkdefglappendx$i$j$k這時總共有三次循環(huán),x的值為adebfgc。break和continue命令在循環(huán)體中,可以用break和continue命令中斷循環(huán)。其中break命令結(jié)束整個循環(huán)過程,并從循環(huán)中跳出,continue只是結(jié)束本次循環(huán)。switc
32、h命令和C語言中switch語句一樣,TCL中的switch命令也可以由if命令實現(xiàn)。只是書寫起來較為煩瑣。switch命令的語法為:switch?options?stringpatternbody?patternbody.?第一個是可選參數(shù)options,表示進行匹配的方式。TCL支持三種匹配方式:-exact方式,-glob方式,-regexp方式,缺省情況表示-glob方式。-exact方式表示的是精確匹配,-glob方式的匹配方式和stringmatch命令的匹配方式相同(第八節(jié)介紹),-regexp方式是正規(guī)表達式的匹配方式(第八節(jié)介紹)。第二個參數(shù)string是要被用來作測試的值,
33、第三個參數(shù)是括起來的一個或多個元素對,例:switch$xa-bincrt1cincrt2defaultincrt3其中a的后面跟一個表示使用和下一個模式相同的腳本。default表示匹配任意值。一旦switch命令找到一個模式匹配,就執(zhí)行相應(yīng)的腳本,并返回腳本的值,作為switch命令的返回值。eval命令eval命令是一個用來構(gòu)造和執(zhí)行TCL腳本的命令,其語法為:evalarg?arg.?它可以接收一個或多個參數(shù),然后把所有的參數(shù)以空格隔開組合到一起成為一個腳本,然后對這個腳本進行求值。例如:evalseta2;setb44source命令source命令讀一個文件并把這個文件的內(nèi)容作為一
34、個腳本進行求值。例如:sourcee:/tcl&c/hello.tcl注意路徑的描述應(yīng)該和UNIX相同,使用/而不是。過程(procedure)TCL支持過程的定義和調(diào)用,在TCL中,過程可以看作是用TCL腳本實現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數(shù)。過程定義和返回值TCL中過程是由proc命令產(chǎn)生的:例如:%procaddxyexpr$x+$yproc命令的第一個參數(shù)是你要定義的過程的名字,第二個參數(shù)是過程的參數(shù)列表,參數(shù)之間用空格隔開,第三個參數(shù)是一個TCL腳本,代表過程體。proc生成一個新的命令,可以象固有
35、命令一樣調(diào)用:%add123在定義過程時,你可以利用return命令在任何地方返回你想要的值。return命令迅速中斷過程,并把它的參數(shù)作為過程的結(jié)果。例如:%procabsxif$x=0return$xreturnexpr-$x過程的返回值是過程體中最后執(zhí)行的那條命令的返回值。局部變量和全局變量對于在過程中定義的變量,因為它們只能在過程中被訪問,并且當(dāng)過程退出時會被自動刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內(nèi)部;全局變量的作用域則不包括所有過程的內(nèi)部。這一點和C語言有很
36、大的不同.如果我們想在過程內(nèi)部引用一個全局變量的值,可以使用global命令。例如:%seta44%procsamplexglobalaincrareturnexpr$a+$x%sample38%seta5全局變量a在過程中被訪問。在過程中對a的改變會直接反映到全局上。如果去掉語句globala,TCL會出錯,因為它不認識變量a.缺省參數(shù)和可變個數(shù)參數(shù)TCL還提供三種特殊的參數(shù)形式:首先,你可以定義一個沒有參數(shù)的過程,例如:procaddexpr2+3其次,可以定義具有缺省參數(shù)值的過程,我們可以為過程的部分或全部參數(shù)提供缺省值,如果調(diào)用過程時未提供那些參數(shù)的值,那么過程會自動使用缺省值賦給相應(yīng)
37、的參數(shù)。和CC+中具有缺省參數(shù)值的函數(shù)一樣,有缺省值的參數(shù)只能位于參數(shù)列表的后部,即在第一個具有缺省值的參數(shù)后面的所有參數(shù),都只能是具有缺省值的參數(shù)。例如:procaddval1val22val33expr$val1+$val2+$val3則:add1/值為6add220/值為25add456/值為15另外,TCL的過程定義還支持可變個數(shù)的參數(shù),如果過程的最后一個參數(shù)是args,那么就表示這個過程支持可變個數(shù)的參數(shù)調(diào)用。調(diào)用時,位于args以前的參數(shù)象普通參數(shù)一樣處理,但任何附加的參數(shù)都需要在過程體中作特殊處理,過程的局部變量args將會被設(shè)置為一個列表,其元素就是所有附加的變量。如果沒有附加
38、的變量,args就設(shè)置成一個空串,下面是一個例子:procaddval1argssetsum$val1foreachi$argsincrsum$ireturn$sum則:add2/值為2add23456/值為20引用:upvar命令語法:upvar?level?otherVarmyVar?otherVarmyVar.?upvar命令使得用戶可以在過程中對全局變量或其他過程中的局部變量進行訪問。upvar命令的第一個參數(shù)otherVar是我們希望以引用方式訪問的參數(shù)的名字,第二個參數(shù)myVar是這個過程中的局部變量的名字,一旦使用了upvar命令把otherVar和myVar綁定,那么在過程中對
39、局部變量myVar的讀寫就相當(dāng)于對這個過程的調(diào)用者中otherVar所代表的局部變量的讀寫。下面是一個例子:%proctempargupvar$argbsetbexpr$b+2%procmyexpvarseta4tempareturnexpr$var+$a則:%myexp713這個例子中,upvar把$arg(實際上是過程myexp中的變量a)和過程temp中的變量b綁定,對b的讀寫就相當(dāng)于對a的讀寫。upvar命令語法中的level參數(shù)表示:調(diào)用upvar命令的過程相對于我們希望引用的變量myVar在調(diào)用棧中相對位置。例如:upvar2otherx這個命令使得當(dāng)前過程的調(diào)用者的調(diào)用者中的變量
40、other,可以在當(dāng)前過程中利用x訪問。缺省情況下,level的值為1,即當(dāng)前過程(上例中的temp)的調(diào)用者(上例中的myexp)中的變量(上例中myexp的a)可以在當(dāng)前過程中利用局部變量(上例中temp的b)訪問。如果要訪問全局變量可以這樣寫:upvar0otherx那么,不管當(dāng)前過程處于調(diào)用棧中的什么位置,都可以在當(dāng)前過程中利用x訪問全局變量other。字符串操作因為TCL把所有的輸入都當(dāng)作字符串看待,所以TCL提供了較強的字符串操作功能,TCL中與字符串操作有關(guān)的命令有:string、format、regexp、regsub、scan等。format命令語法:formatformat
41、string?vluevalue.?format命令類似于ANSIC中的sprintf函數(shù)和MFC中CString類提供的Format成員函數(shù)。它按formatstring提供的格式,把各個value的值組合到formatstring中形成一個新字符串,并返回。例如:%setnamejohnJohn%setage2020%setmsgformat%sis%dyearsold$name$agejohnis20yearsoldscan命令語法:scanstringformatvarName?varName.?scan命令可以認為是format命令的逆,其功能類似于ANSIC中的sscanf函數(shù)。它
42、按format提供的格式分析string字符串,然后把結(jié)果存到變量varName中,注意除了空格和TAB鍵之外,string和format中的字符和%必須匹配。例如:%scansome2634some%d%dab2%seta26%setb34%scan8%d.%d.%d.%dcdef4%putsformatthevalueofcis%d,dis%d,eis%d,fis%d$c$d$e$fthevalueofcis12,dis34,eis56,fis78scan命令的返回值是匹配的變量個數(shù)。而且,我們發(fā)現(xiàn),如果變量varName不存在的話,TCL會自動聲明該變量。regexp命令語法:regex
43、p?switchs?-?expstring?matchVar?subMatchVarsubMatchVar.?regexp命令用于判斷正規(guī)表達式exp是否全部或部分匹配字符串string,匹配返回1,否則0。在正規(guī)表達式中,一些字符具有特殊的含義,下表一一列出,并給予了解釋。字符意義.匹配任意單個字符表示從頭進行匹配$表示從末尾進行匹配x匹配字符x,這可以抑制字符x的含義chars匹配字符集合chars中給出的任意字符,如果chars中的第一個字符是,表示匹配任意不在chars中的字符,chars的表示方法支持a-z之類的表示。(regexp)把regexp作為一個單項進行匹配*對*前面的項0
44、進行次或多次匹配+對前面的項進行1次或多次匹配?對?前面的項進行0次或1次匹配regexp1|regexp2匹配regexp1或regexp2中的一項下面的一個例子是從TclandTkToolKit中摘下來的,下面進行說明:(0 x)?0-9a-fA-F+|0-9+)$這個正規(guī)表達式匹配任何十六進制或十進制的整數(shù)。兩個正規(guī)表達式以|分開(0 x)?0-9a-fA-F+和0-9+,表示可以匹配其中的任何一個,事實上前者匹配十六進制,后者匹配的十進制。表示必須從頭進行匹配,從而上述正規(guī)表達式不匹配jk12之類不是以0 x或數(shù)字開頭的串。表示必須從末尾開始匹配,從而上述正規(guī)表達式不匹配12jk之類不
45、是數(shù)字或a-fA-F結(jié)尾的串。下面以(0 x)?0-9a-fA-F+進行說明,(0 x)表示0 x一起作為一項,?表示前一項(0 x)可以出現(xiàn)0次或多次,0-9a-fA-F表示可以是任意0到9之間的單個數(shù)字或a到f或A到F之間的單個字母,表示象前面那樣的單個數(shù)字或字母可以重復(fù)出現(xiàn)一次或多次。%regexp(0 x)?0-9a-fA-F+|0-9+)$ab1%regexp(0 x)?0-9a-fA-F+|0-9+)$0 xabcd1%regexp(0 x)?0-9a-fA-F+|0-9+)$123451%regexp(0 x)?0-9a-fA-F+|0-9+)$123j0如果regexp命令后面
46、有參數(shù)matchVar和subMatchVar,則所有的參數(shù)被當(dāng)作變量名,如果變量不存在,就會被生成。regexp把匹配整個正規(guī)表達式的子字符串賦給第一個變量,匹配正規(guī)表達式的最左邊的子表達式的子字符串賦給第二個變量,依次類推,例如:%regexp(0-9+)*(a-z+)thereis100applestotalnumword1%puts$total,$num,$word100apples,100,applesregexp可以設(shè)置一些開關(guān)(switchs,來控制匹配結(jié)果:-nocase匹配時不考慮大小寫-indices改變各個變量的值,這是各個變量的值變成了對應(yīng)的匹配子串在整個字符串中所處位
47、置的索引。例如:%regexp-indices(0-9+)*(a-z+)thereis100applestotalnumword1%puts$total,$num,$word920,1012,1520正好子串“100apples”的序號是9-20,100的序號是10-12,apples的序號是15-20-表示這后面再沒有開關(guān)(switchs了,即使后面有以-開頭的參數(shù)也被當(dāng)作正規(guī)表達式的一部分。regsub命令語法:regsub?switchs?expstringsubSpecvarnameregsub的第一個參數(shù)是一個整個表達式,第二個參數(shù)是一個輸入字符串,這一點和regexp命令完全一樣,
48、也是當(dāng)匹配時返回1,否則返回0。不過regsub用第三個參數(shù)的值來替換字符串string中和正規(guī)表達式匹配的部分,第四個參數(shù)被認為是一個變量,替換后的字符串存入這個變量中。例如:%regsubthereTheylivetherelivestheirx1%puts$xTheylivetheirlives這里there被用their替換了。regsub命令也有幾個開關(guān)(switchs):-nocase意義同regexp命令中。-all沒有這個開關(guān)時,regsub只替換第一個匹配,有了這個開關(guān),regsub將把所有匹配的地方全部替換。-意義同regexp命令中。string命令string命令的語法
49、:stringoptionarg?arg.?string命令具有強大的操作字符串的功能,其中的option選項多達20個。下面介紹其中常用的部分。stringcompare?-nocase?-lengthint?string1string2把字符串string1和string2進行比較,返回值為-1、0或1,分別對應(yīng)string1小于、等于或大于string2。如果有-length參數(shù),那么只比較前int個字符,如果int為負數(shù),那么這個參數(shù)被忽略。如果有-nocase參數(shù),那么比較時不區(qū)分大小寫。stringequal?-nocase?-lengthint?string1string2把字符
50、串string1和string2進行比較,如果兩者相同,返回值為1,否則返回0。其他參數(shù)與8.5.1同。stringfirststring1string2?startindex?在string2中從頭查找與string1匹配的字符序列,如果找到,那么就返回匹配的第一個字母所在的位置(0-based)。如果沒有找到,那么返回-1。如果給出了startindex變量,那么將從startindex處開始查找。例如:%stringfirstabdefabc3%stringfirstabdefabc4-1stringindexstringcharIndex返回string中第charIndex個字符(0
51、-based)。charIndex可以是下面的值:整數(shù)n:字符串中第n個字符(0-based)end:最后一個字符end整數(shù)n:倒數(shù)第n個字符。stringindexabcdend-1返回字符c如果charIndex小于0,或者大于字符串string的長度,那么返回空。例如:%stringindexabcdef2c%stringindexabcdefend-2dstringlaststring1string2?startindex?參照8.5.3.唯一的區(qū)別是從后往前查找stringlengthstring返回字符串string的長度.stringmatch?-nocase?patternst
52、ring如果pattern匹配string,那么返回1,否則返回0.如果有-nocase參數(shù),那么就不區(qū)分大小寫.在pattern中可以使用通配符:*匹配string中的任意長的任意字符串,包括空字符串.?匹配string中任意單個字符chars匹配字符集合chars中給出的任意字符,其中可以使用A-Z這種形式x匹配單個字符x,使用是為了讓x可以為字符*,-,.例子:%stringmatch*abcdef1%stringmatcha*abcdef1stringmatcha?cdefabcdef1%stringmatchab-fcdefabcdef/注意一定藥用,否則TCL解釋器會把b-f當(dāng)作命
53、令名1/從而導(dǎo)致錯誤%stringmatchab-fcdefaccdef1stringrangestringfirstlast返回字符串string中從第first個到第last個字符的子字符串(0-based)。如果first0,那么first被看作0,如果last大于或等于字符串的長度,那么last被看作end,如果first比last大,那么返回空。stringrepeatstringcount返回值為:重復(fù)了string字符串count次的字符串。例如:%stringrepeatabc2abcabcstringreplacestringfirstlast?newstring?返回值為:
54、從字符串string中刪除了第first到第last個字符(0-based)的字符串,如果給出了newstring變量,那么就用newstring替換從第first到第last個字符。如果firstdefstringtrimleftstring?chars?同8.5.13。不過只刪除左邊的字符。stringtrimrightstring?chars?同8.5.13。不過只刪除右邊的字符。文件訪問TCL提供了豐富的文件操作的命令。通過這些命令你可以對文件名進行操作(查找匹配某一模式的文件)、以順序或隨機方式讀寫文件、檢索系統(tǒng)保留的文件信息(如最后訪問時間)。文件名TCL中文件名和我們熟悉的win
55、dows表示文件的方法有一些區(qū)別:在表示文件的目錄結(jié)構(gòu)時它使用/,而不是,這和TCL最初是在UNIX下實現(xiàn)有關(guān)。比如C盤tcl目錄下的文件sample.tcl在TCL中這樣表示:C:/tcl/sample.tcl。基本文件輸入輸出命令這個名為tgrep的過程,可以說明TCL文件I/O的基本特點:proctgreppatternfilenamesetfopen$filenamerwhilegets$flineifregexp$pattern$lineputsstdout$lineclose$f以上過程非常象UNIX的grep命令,你可以用兩個參數(shù)調(diào)用它,一個是模式,另一個是文件名,tgrep將打
56、印出文件中所有匹配該模式的行。下面介紹上述過程中用到的幾個基本的文件輸入輸出命令。openname?access?open命令以access方式打開文件name。返回供其他命令(gets,close等)使用的文件標(biāo)識。如果name的第一個字符是“|”,管道命令被觸發(fā),而不是打開文件。文件的打開方式和我們熟悉的C語言類似,有以下方式:r只讀方式打開。文件必須已經(jīng)存在。這是默認方式。r+讀寫方式打開,文件必須已經(jīng)存在。w只寫方式打開文件,如果文件存在則清空文件內(nèi)容,否則創(chuàng)建一新的空文件。w+讀寫方式打開文件,如文件存在則清空文件內(nèi)容,否則創(chuàng)建新的空文件。a只寫方式打開文件,文件必須存在,并把指針指
57、向文件尾。a+讀寫方式打開文件,并把指針指向文件尾。如文件不存在,創(chuàng)建新的空文件。open命令返回一個字符串用于表識打開的文件。當(dāng)調(diào)用別的命令(如:gets,puts,close,對打開的文件進行操作時,就可以使用這個文件標(biāo)識符。TCL有三個特定的文件標(biāo)識:stdin,stdout和stderr,分別對應(yīng)標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯誤通道,任何時候你都可以使用這三個文件標(biāo)識。getsfileId?varName?讀fileId標(biāo)識的文件的下一行,忽略換行符。如果命令中有varName就把該行賦給它,并返回該行的字符數(shù)(文件尾返回-1),如果沒有varName參數(shù),返回文件的下一行作為命令結(jié)果(如果到
58、了文件尾,就返回空字符串)。和gets類似的命令是read,不過read不是以行為單位的,它有兩種形式:read?-nonewline?fileId讀并返回fileId標(biāo)識的文件中所有剩下的字節(jié)。如果沒有nonewline開關(guān),則在換行符處停止。readfileIdnumBytes在fileId標(biāo)識的文件中讀并返回下一個numbytes字節(jié)。puts?-nonewline?fileId?stringputs命令把string寫到fileId中,如果沒有nonewline開關(guān)的話,添加換行符。fileId默認是stdout。命令返回值為一空字符串。puts命令使用C的標(biāo)準(zhǔn)I/O庫的緩沖區(qū)方案,這
59、就意味著使用puts產(chǎn)生的信息不會立即出現(xiàn)在目標(biāo)文件中。如果你想使數(shù)據(jù)立即出現(xiàn)在文件中,那你就調(diào)用flush命令:flushfileId把緩沖區(qū)內(nèi)容寫到fileId標(biāo)識的文件中,命令返回值為空字符串。flush命令迫使緩沖區(qū)數(shù)據(jù)寫到文件中。flush直到數(shù)據(jù)被寫完才返回。當(dāng)文件關(guān)閉時緩沖區(qū)數(shù)據(jù)會自動flush。close?fileId?關(guān)閉標(biāo)識為fileId的文件,命令返回值為一空字符串。這里特別說明的一點是,TCL中對串口、管道、socket等的操作和對文件的操作類似,以上對文件的操作命令同樣適用于它們。隨機文件訪問默認文件輸入輸出方式是連續(xù)的:即每個gets或爎ead命令返回的是上次get
60、s或爎ead訪問位置后面的字節(jié),每個puts命令寫數(shù)據(jù)是接著上次puts寫的位置接著寫。TCL提供了seek,tell和eof等命令使用戶可以非連續(xù)訪問文件。每個打開的打開文件都有訪問點,即下次讀寫開始的位置。文件打開時,訪問點總是被設(shè)置為文件的開頭或結(jié)尾,這取決于打開文件時使用的訪問模式。每次讀寫后訪問位置按訪問的字節(jié)數(shù)后移相應(yīng)的位數(shù)??梢允褂胹eek命令來改變文件的訪問點:seekfileIdoffset?origin?把fileId標(biāo)識的文件的訪問點設(shè)置為相對于origin偏移量為offset的位置。origin可以是start,current,end,默認是start。命令的返回值是一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鳳爪現(xiàn)貨采購合同范本
- 公寓改造協(xié)議空間優(yōu)化
- 35萬畝茶葉種植及產(chǎn)品深加工項目可行性分析報告
- 2025年氯化石蠟項目可行性研究報告
- 公司退休返聘勞務(wù)合同范本
- 個人采購月餅合同范本
- 企業(yè)之間電子合同范本
- 代理記賬廉價合同范本
- 臨時場地出租合同范例
- 酒類實習(xí)報告4篇
- 西方政治思想史-課件
- 學(xué)生心理健康測量表
- GA745-2017銀行自助設(shè)備、自助銀行安全防范要求國標(biāo)
- 邯鄲市垃圾填埋場封場方案
- 2020閩教版信息技術(shù)四年級(下冊)全冊教案
- introduction to pipeline pilot在處理數(shù)據(jù)中的一些應(yīng)用
- 智能中臺數(shù)據(jù)底座解決方案
- 突發(fā)性聾診療指南 (2015版)
- 光伏發(fā)電工程施工組織設(shè)計施工工程光伏發(fā)電工程光伏發(fā)電施工組織設(shè)計
- 11鋼的表面淬火解析
- 導(dǎo)數(shù)應(yīng)用舉例
評論
0/150
提交評論