版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、TCL培訓(xùn)教程(全)(內(nèi)部使用)深圳市華為技術(shù)有限公司目 錄1引言62語(yǔ)法72.1腳本、命令和單詞符號(hào)72.2置換(substitution)72.2.1變量置換(variable subtitution)82.2.2命令置換(command substitution)82.2.3反斜杠置換(backslash substitution)92.2.4雙引號(hào)和花括號(hào)102.3注釋103變量113.1簡(jiǎn)單變量113.2數(shù)組123.3相關(guān)命令123.3.1set123.3.2unset123.3.3append和incr134表達(dá)式134.1操作數(shù)134.2運(yùn)算符和優(yōu)先級(jí)141.1數(shù)學(xué)函數(shù)142Li
2、st162.1list命令162.2concat命令:162.3lindex命令162.4llength命令162.5linsert命令162.6lreplace命令:172.7lrange 命令:172.8lappend命令:172.9lsearch 命令:172.10lsort命令:182.11split命令:182.12join命令193控制流193.1if命令193.2循環(huán)命令:while 、for、 foreach193.2.1while命令193.2.2for命令203.2.3foreach命令203.2.4break和continue命令213.2.5switch 命令213.3
3、eval命令223.4source命令224過(guò)程(procedure)224.1過(guò)程定義和返回值224.2局部變量和全局變量234.3缺省參數(shù)和可變個(gè)數(shù)參數(shù)234.4引用:upvar245字符串操作265.1format命令265.2scan命令265.3regexp命令271.1regsub命令281.2string命令291.2.1string compare ?-nocase? ?-length int? string1 string2291.2.2string equal ?-nocase? ?-length int? string1 string2291.2.3string firs
4、t string1 string2 ?startindex?291.2.4string index string charIndex301.2.5string last string1 string2 ?startindex?301.2.6string length string301.2.7string match ?-nocase? pattern string301.2.8string range string first last311.2.9string repeat string count311.2.10string replace string first last ?news
5、tring?311.2.11string tolower string ?first? ?last?311.2.12string toupper string ?first? ?last?311.2.13string trim string ?chars?311.2.14string trimleft string ?chars?321.2.15string trimright string ?chars?322文件訪問(wèn)322.1文件名322.2基本文件輸入輸出命令322.3隨機(jī)文件訪問(wèn)342.4當(dāng)前工作目錄342.5文件操作和獲取文件信息353錯(cuò)誤和異常393.1錯(cuò)誤403.2從TCL腳本中
6、產(chǎn)生錯(cuò)誤413.3使用catch捕獲錯(cuò)誤413.4其他異常421深入TCL441.1查詢數(shù)組中的元素441.2info命令461.2.1變量信息461.1.1過(guò)程信息481.1.2命令信息491.1.3TCL的版本和庫(kù)491.1.4命令的執(zhí)行時(shí)間491.1.5跟蹤變量501.1.6命令的重命名和刪除531.1.7unknown命令531.1.8自動(dòng)加載542歷史記錄553TCL和CC+583.1生成自己的TCLSH583.2擴(kuò)展自己的命令:方法(一)593.2.1編寫(xiě)擴(kuò)展命令對(duì)應(yīng)的C/C+過(guò)程593.2.2注冊(cè)命令613.2.3命令返回值和命令對(duì)應(yīng)的過(guò)程的返回值623.3擴(kuò)展自己的命令:方法(
7、二)643.3.1Tcl_Obj結(jié)構(gòu)643.3.2編寫(xiě)擴(kuò)展命令對(duì)應(yīng)的C/C+過(guò)程663.3.3注冊(cè)命令673.4利用clientData參數(shù)和deleteProc參數(shù)673.5在C/C+應(yīng)用程序中嵌入TCL714總結(jié)72TCL培訓(xùn)教程(全)關(guān)鍵詞:TCL 摘 要:本文是TCL教材的第三稿,前兩稿分別是TCL的使用和TCL培訓(xùn)教程。這一稿加入了不少內(nèi)容,是北研TCL興趣小組共同努力的結(jié)果。本文詳細(xì)介紹了TCL的各個(gè)方面,特別對(duì)利用CC+語(yǔ)言擴(kuò)展TCL命令作了詳細(xì)論述。本文附有大量實(shí)例??s略語(yǔ)清單: TCL Tool Command Language 一種腳本語(yǔ)言參考資料清單: 請(qǐng)?jiān)诒砀裰辛_列本文
8、檔所引用的有關(guān)參考文獻(xiàn)名稱、作者、標(biāo)題、編號(hào)、發(fā)布日期和出版單位等基本信息。參考資料清單名稱作者編號(hào)發(fā)布日期查閱地點(diǎn)或渠道出版單位(若不為本公司發(fā)布的文獻(xiàn),請(qǐng)?zhí)顚?xiě)此列)Tcl and Tk ToolKitJohn K.Ousterhout98123595161999自己的圖書(shū)Addison Wesley Publishing CommpanyTCL的使用陳旭盛自寫(xiě)文檔TCL培訓(xùn)教程陳旭盛自寫(xiě)文檔1 引言TCL(Tool Command Language)是一種解釋執(zhí)行的腳本語(yǔ)言(Scripting Language)。 它提供了通用的編程能力:支持變量、過(guò)程和控制結(jié)構(gòu);同時(shí)TCL還擁有一個(gè)功能
9、強(qiáng)大的固有的核心命令集。由于TCL的解釋器是用一個(gè)CC+語(yǔ)言的過(guò)程庫(kù)實(shí)現(xiàn)的,因此在某種意義上我們又可以把TCL看作一個(gè)C庫(kù),這個(gè)庫(kù)中有豐富的用于擴(kuò)展TCL命令的CC+過(guò)程和函數(shù),可以很容易就在CC+應(yīng)用程序中嵌入TCL,而且每個(gè)應(yīng)用程序都可以根據(jù)自己的需要對(duì)TCL語(yǔ)言進(jìn)行擴(kuò)展。我們可以針對(duì)某一特定應(yīng)用領(lǐng)域?qū)CL語(yǔ)言的核心命令集進(jìn)行擴(kuò)展,加入適合于自己的應(yīng)用領(lǐng)域的擴(kuò)展命令,如果需要,甚至可以加入新的控制結(jié)構(gòu),TCL解釋器將把擴(kuò)展命令和擴(kuò)展控制結(jié)構(gòu)與固有命令和固有控制結(jié)構(gòu)同等看待。擴(kuò)展后的TCL語(yǔ)言將可以繼承TCL 核心部分的所有功能,包括核心命令、控制結(jié)構(gòu)、數(shù)據(jù)類(lèi)型、對(duì)過(guò)程的支持等。根據(jù)需要,
10、我們甚至可以屏蔽掉TCL的某些固有命令和固有控制結(jié)構(gòu)。通過(guò)對(duì)TCL的擴(kuò)展、繼承或屏蔽,用戶用不著象平時(shí)定義一種計(jì)算機(jī)語(yǔ)言那樣對(duì)詞法、語(yǔ)法、語(yǔ)義、語(yǔ)用等各方面加以定義,就可以方便的為自己的應(yīng)用領(lǐng)域提供一種功能完備的腳本語(yǔ)言。TCL良好的可擴(kuò)展性使得它能很好地適應(yīng)產(chǎn)品測(cè)試的需要,測(cè)試任務(wù)常常會(huì)由于設(shè)計(jì)和需求的改變而迅速改變,往往讓測(cè)試人員疲于應(yīng)付。利用TCL的可擴(kuò)展性,測(cè)試人員就可以迅速繼承多種新技術(shù),并針對(duì)產(chǎn)品新特點(diǎn)迅速推出擴(kuò)展TCL命令集,以用于產(chǎn)品的測(cè)試中,可以較容易跟上設(shè)計(jì)需求的變化。另外,因?yàn)門(mén)CL是一種比CC+ 語(yǔ)言有著更高抽象層次的語(yǔ)言,使用TCL可以在一種更高的層次上編寫(xiě)程序,它屏
11、蔽掉了編寫(xiě)CC+程序時(shí)必須涉及到的一些較為煩瑣的細(xì)節(jié),可以大大地提高開(kāi)發(fā)測(cè)試?yán)乃俣?。而且?使用TCL語(yǔ)言寫(xiě)的測(cè)試?yán)_本,即使作了修改,也用不著重新編譯就可以調(diào)用TCL解釋器直接執(zhí)行??梢允s不少時(shí)間。TCL 目前已成為自動(dòng)測(cè)試中事實(shí)上的標(biāo)準(zhǔn)。2 語(yǔ)法簡(jiǎn)單的講,TCL語(yǔ)言的語(yǔ)法實(shí)際上是一些TCL解釋器怎樣對(duì)TCL命令進(jìn)行分析的規(guī)則的集合。2.1 腳本、命令和單詞符號(hào)一個(gè)TCL腳本可以包含一個(gè)或多個(gè)命令。命令之間必須用換行符或分號(hào)隔開(kāi),下面的兩個(gè)腳本都是合法的:set a 1set b 2或set a 1;set b 2TCL的每一個(gè)命令包含一個(gè)或幾個(gè)單詞,第一個(gè)單詞代表命令名,另外的單詞則是
12、這個(gè)命令的參數(shù),單詞之間必須用空格或TAB鍵隔開(kāi)。TCL解釋器對(duì)一個(gè)命令的求值過(guò)程分為兩部分:分析和執(zhí)行。在分析階段,TCL 解釋器運(yùn)用規(guī)則把命令分成一個(gè)個(gè)獨(dú)立的單詞,同時(shí)進(jìn)行必要的置換(substitution); 在執(zhí)行階段,TCL 解釋器會(huì)把第一個(gè)單詞當(dāng)作命令名,并查看這個(gè)命令是否有定義,如果有定義就激活這個(gè)命令對(duì)應(yīng)的C/C+過(guò)程,并把所有的單詞作為參數(shù)傳遞給該命令過(guò)程,讓命令過(guò)程進(jìn)行處理。2.2 置換(substitution)注:在下面的所有章節(jié)的例子中,為T(mén)CL的命令提示符,輸入命令回車(chē)后,TCL會(huì)在接著的一行輸出命令執(zhí)行結(jié)果。/后面是我自己加上的說(shuō)明,不是例子的一部分。TCL解釋
13、器在分析命令時(shí),把所有的命令參數(shù)都當(dāng)作字符串看待,例如:%set x 10 /定義變量x,并把x的值賦為1010%set y x+100 /y的值是x+100,而不是我們期望的110x+100上例的第二個(gè)命令中,x被看作字符串x+100的一部分,如果我們想使用x的值10 ,就必須告訴TCL解釋器:我們?cè)谶@里期望的是變量x的值,而非字符x。怎么告訴TCL解釋器呢,這就要用到TCL語(yǔ)言中提供的置換功能。TCL提供三種形式的置換:變量置換、命令置換和反斜杠置換。每種置換都會(huì)導(dǎo)致一個(gè)或多個(gè)單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內(nèi)的每一個(gè)單詞中,而且置換可以嵌套。2.2.1 變量置換(va
14、riable subtitution)變量置換由一個(gè)符號(hào)標(biāo)記,變量置換會(huì)導(dǎo)致變量的值插入一個(gè)單詞中。例如:%set y $x+100 /y的值是10+100,這里x被置換成它的值1010100這時(shí),y的值還不是我們想要的值110,而是10+100,因?yàn)門(mén)CL解釋器把10+100看成是一個(gè)字符串而不是表達(dá)式,y要想得到值110,還必須用命令置換,使得TCL會(huì)把10+100看成一個(gè)表達(dá)式并求值。2.2.2 命令置換(command substitution)命令置換是由括起來(lái)的TCL命令及其參數(shù),命令置換會(huì)導(dǎo)致某一個(gè)命令的所有或部分單詞被另一個(gè)命令的結(jié)果所代替。例如:%set y expr $x+
15、100110y的值是110,這里當(dāng)TCL解釋器遇到字符時(shí),它就會(huì)把隨后的expr作為一個(gè)命令名,從而激活與expr對(duì)應(yīng)的C/C+過(guò)程,并把expr和變量置換后得到的10+110傳遞給該命令過(guò)程進(jìn)行處理。如果在上例中我們?nèi)サ簦敲碩CL會(huì)報(bào)錯(cuò)。因?yàn)樵谡G闆r下,TCL解釋器只把命令行中的第一個(gè)單詞作為看作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。 注意,中必須是一個(gè)合法的TCL腳本,長(zhǎng)度不限。中腳本的值為最后一個(gè)命令的返回值,例如:%set y expr $x+100;set b 300 /y的值為300,因?yàn)閟et b 300的返回值為300300有了命令置換,實(shí)際上就表示命令之
16、間是可以嵌套的,即一個(gè)命令的結(jié)果可以作為別的命令的參數(shù)。2.2.3 反斜杠置換(backslash substitution)TCL語(yǔ)言中的反斜杠置換類(lèi)似于C語(yǔ)言中反斜杠的用法,主要用于在單詞符號(hào)中插入諸如換行符、空格、$等被TCL解釋器當(dāng)作特殊符號(hào)對(duì)待的字符。例如:set msg multiple space /msg的值為multiple space。如果沒(méi)有的話,TCL會(huì)報(bào)錯(cuò),因?yàn)榻忉屍鲿?huì)把這里最后兩個(gè)單詞之間的空格認(rèn)為是分隔符,于是發(fā)現(xiàn)set命令有多于兩個(gè)參數(shù),從而報(bào)錯(cuò)。加入了后,空格不被當(dāng)作分隔符,multiple space被認(rèn)為是一個(gè)單詞(word)。又例如: %set msg
17、money $3333 nArray a2 /這個(gè)命令的執(zhí)行結(jié)果為:money $3333 Array a2這里的$不再被當(dāng)作變量置換符。TCL支持以下的反斜杠置換:Backslash Sequence Replaced Bya Audible alert (0x7)b Backspace (0x8)f Form feed (0xc)n Newline (0xa)r Carriage return (0xd)t Tab (0x9)v Vertical tab (0xb)ddd Octal value given by ddd(one, two, or three ds)xhh Hex valu
18、e given by hh(any number of hs) newline space A single space character.例如: set a x48 /對(duì)應(yīng) xhhH /十六進(jìn)制的48正好是72,對(duì)應(yīng)H set a 110 /對(duì)應(yīng) dddH /八進(jìn)制的110正好是72,對(duì)應(yīng)Hset a expr / 對(duì)應(yīng)newline space,一個(gè)命令可以用newline轉(zhuǎn)到下一行繼續(xù) 2+352.2.4 雙引號(hào)和花括號(hào) 除了使用反斜杠外,TCL提供另外兩種方法來(lái)使得解釋器把分隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號(hào)和花括號(hào)()。TCL解釋器對(duì)雙引號(hào)中的各種
19、分隔符將不作處理,但是對(duì)換行符 及和兩種置換符會(huì)照常處理。例如:%set x 100100%set y $x ddd 100 ddd而在花括號(hào)中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會(huì)對(duì)其作特殊處理。%set y /n$x expr 10+100 /n$x expr 10+100 2.3 注釋TCL中的注釋符是,和直到所在行結(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對(duì)注釋將不作任何處理。不過(guò),要注意的是,必須出現(xiàn)在TCL解釋器期望命令的第一個(gè)字符出現(xiàn)的地方,才被當(dāng)作注釋。例如:%This is a comment%set a 100 # Not a commentw
20、rong # args: should be set varName ?newValue?%set b 101 ; # this is a comment101第二行中就不被當(dāng)作注釋符,因?yàn)樗霈F(xiàn)在命令的中間,TCL解釋器把它和后面的字符當(dāng)作命令的參數(shù)處理,從而導(dǎo)致錯(cuò)誤。而第四行的就被作為注釋,因?yàn)榍耙粋€(gè)命令已經(jīng)用一個(gè)分號(hào)結(jié)束,TCL解釋器期望下一個(gè)命令接著出現(xiàn)?,F(xiàn)在在這個(gè)位置出現(xiàn)#,隨后的字符就被當(dāng)作注釋了。3 變量TCL支持兩種類(lèi)型的變量:簡(jiǎn)單變量和數(shù)組。3.1 簡(jiǎn)單變量 一個(gè)TCL的簡(jiǎn)單變量包含兩個(gè)部分:名字和值。名字和值都可以是任意字符串。例如一個(gè)名為 “1323 7&*: hdgg的
21、變量在TCL中都是合法的。不過(guò)為了更好的使用置換(substitution),變量名最好按CC+語(yǔ)言中標(biāo)識(shí)符的命名規(guī)則命名。 TCL解釋器在分析一個(gè)變量置換時(shí),只把從符號(hào)往后直到第一個(gè)不是字母、數(shù)字或下劃線的字符之間的單詞符號(hào)作為要被置換的變量的名字。例如:% set a 22set a.1 44% set b $a.12.1在最后一個(gè)命令行,我們希望把變量a.1的值付給b,但是TCL解釋器在分析時(shí)只把$符號(hào)之后直到第一個(gè)不是字母、數(shù)字或下劃線的字符(這里是.)之間的單詞符號(hào)(這里是a)當(dāng)作要被置換的變量的名字,所以TCL解釋器把a(bǔ)置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷
22、不同。當(dāng)然,如果變量名中有不是字母、數(shù)字或下劃線的字符,又要用置換,可以用花括號(hào)把變量名括起來(lái)。例如:%set b $a.14TCL中的set命令能生成一個(gè)變量、也能讀取或改變一個(gè)變量的值。例如: set a kdfj kjdfkdfj kjdf如果變量a還沒(méi)有定義,這個(gè)命令將生成 變量a,并將其值置為kdfj kjdf,若a已定義,就簡(jiǎn)單的把a(bǔ)的值置為kdfj kjdf。set akdfj kjdf 這個(gè)只有一個(gè)參數(shù)的set命令讀取a的當(dāng)前值kdfj kjdf。 3.2 數(shù)組 數(shù)組是一些元素的集合。TCL的數(shù)組和普通計(jì)算機(jī)語(yǔ)言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨(dú)聲明一個(gè)數(shù)組,數(shù)組只能和
23、數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組名和數(shù)組中元素的名字,TCL中數(shù)組元素的名字(下標(biāo)可以為任何字符串。例如: set day(monday) 1 set day(tuesday) 2 第一個(gè)命令生成一個(gè)名為day的數(shù)組,同時(shí)在數(shù)組中生成一個(gè)名為monday的數(shù)組元素,并把值置為1,第二個(gè)命令生成一個(gè)名為tuesday的數(shù)組元素,并把值置為2。 簡(jiǎn)單變量的置換已經(jīng)在前一節(jié)討論過(guò),這里講一下數(shù)組元素的置換。除了有括號(hào)之外,數(shù)組元素的置換和簡(jiǎn)單變量類(lèi)似。例: set a mondayset day(monday) 1set b $day(monday) /b的值為1,即day(
24、monday)的值。set c $day($a) /c的值為1,即day(monday)的值。TCL不能支持復(fù)雜的數(shù)據(jù)類(lèi)型,這是一個(gè)很大的缺憾,也是TCL受指責(zé)很多的方面。但是TCL的一個(gè)擴(kuò)展ITCL填補(bǔ)了這個(gè)缺憾。3.3 相關(guān)命令3.3.1 set這個(gè)命令在3.1已有詳細(xì)介紹。3.3.2 unset 這個(gè)命令從解釋器中刪除變量,它后面可以有任意多個(gè)參數(shù),每個(gè)參數(shù)是一個(gè)變量名,可以是簡(jiǎn)單變量,也可以是數(shù)組或數(shù)組元素。例如:% unset a b day(monday)上面的語(yǔ)句中刪除了變量a、b和數(shù)組元素day(monday),但是數(shù)組day并沒(méi)有刪除,其他元素還存在,要?jiǎng)h除整個(gè)數(shù)組,只需給出
25、數(shù)組的名字。例如:%puts $day(monday)cant read day(monday): no such element in array% puts $day(tuesday)2%unset day% puts $day(tuesday)cant read day(tuesday): no such variable3.3.3 append和incr這兩個(gè)命令提供了改變變量的值的簡(jiǎn)單手段。append命令把文本加到一個(gè)變量的后面,例如:% set txt hellohello% append txt ! How are youhello! How are youincr命令把一個(gè)變
26、量值加上一個(gè)整數(shù)。incr要求變量原來(lái)的值和新加的值都必須是整數(shù)。%set b aa% incr bexpected integer but got a%set b 22%incr b 354 表達(dá)式TCL中的表達(dá)式類(lèi)似于ANSI C的表達(dá)式。表達(dá)式由操作數(shù)和操作符構(gòu)成,下面分別介紹。4.1 操作數(shù)TCL表達(dá)式的操作數(shù)通常是整數(shù)或?qū)崝?shù)。整數(shù)一般是十進(jìn)制的, 但如果整數(shù)的第一個(gè)字符是0(zero),那么TCL將把這個(gè)整數(shù)看作八進(jìn)制的,如果前兩個(gè)字符是0x則這個(gè)整數(shù)被看作是十六進(jìn)制的。TCL的實(shí)數(shù)的寫(xiě)法與ANSI C中完全一樣。如:2.17.9e+126e43. 4.2 運(yùn)算符和優(yōu)先級(jí) 下面的表格
27、中列出了TCL中用到的運(yùn)算符,它們的語(yǔ)法形式和用法跟ANSI C中很相似。這里就不一一介紹。下表中的運(yùn)算符是按優(yōu)先級(jí)從高到低往下排列的。同一格中的運(yùn)算符優(yōu)先級(jí)相同。語(yǔ)法形式結(jié)果操作數(shù)類(lèi)型-a!aa負(fù)a非aint,floatint,floatinta*ba/ba%b乘除取模int,floatint,floatinta+ba-b加減int,floatint,floatab左移位右移位intintaba=b小于大于小于等于大于等于int,float,stringint,float,stringint,float,stringint,float,stringa= =ba!=b等于不等于int,floa
28、t,stringint,float,stringa&b位操作與intab位操作異或inta|b位操作或inta&b邏輯與int,floata|b邏輯或int,floata?b:c選擇運(yùn)算a:int,float 1.1 數(shù)學(xué)函數(shù)TCL支持常用的數(shù)學(xué)函數(shù),表達(dá)式中數(shù)學(xué)函數(shù)的寫(xiě)法類(lèi)似于CC+語(yǔ)言的寫(xiě)法,數(shù)學(xué)函數(shù)的參數(shù)可以是任意表達(dá)式,多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)。例如:%set x 22% expr 2* sin($x0 . elseif $x1 . elseif $x2 . else . 注意,上例中一定要寫(xiě)在上一行,因?yàn)槿绻贿@樣,TCL 解釋器會(huì)認(rèn)為if命令在換行符處已結(jié)束,下一行會(huì)被當(dāng)成新的命令,
29、從而導(dǎo)致錯(cuò)誤的結(jié)果。在下面的循環(huán)命令的書(shū)寫(xiě)中也要注意這個(gè)問(wèn)題。書(shū)寫(xiě)中還要注意的一個(gè)問(wèn)題是if 和之間應(yīng)該有一個(gè)空格,否則TCL解釋器會(huì)把if作為一個(gè)整體當(dāng)作一個(gè)命令名,從而導(dǎo)致錯(cuò)誤。3.2 循環(huán)命令:while 、for、 foreach3.2.1 while命令語(yǔ)法為: while test body參數(shù)test是一個(gè)表達(dá)式,body是一個(gè)腳本,如果表達(dá)式的值非0,就運(yùn)行腳本,直到表達(dá)式為0才停止循環(huán),此時(shí)while命令中斷并返回一個(gè)空字符串。例如:假設(shè)變量 a 是一個(gè)鏈表,下面的腳本把a(bǔ) 的值復(fù)制到b:set b set i expr llength $a -1while $i=0lapp
30、end b lindex $a $iincr i -13.2.2 for命令語(yǔ)法為: for init test reinit body參數(shù)init是一個(gè)初始化腳本,第二個(gè)參數(shù)test是一個(gè)表達(dá)式,用來(lái)決定循環(huán)什么時(shí)候中斷,第三個(gè)參數(shù)reinit是一個(gè)重新初始化的腳本,第四個(gè)參數(shù)body也是腳本,代表循環(huán)體。下例與上例作用相同:set b for set i expr llength $a -1 $i=0 incr i -1 lappend b lindex $a $i 3.2.3 foreach命令這個(gè)命令有兩種語(yǔ)法形式1。 foreach varName list body第一個(gè)參數(shù)var
31、Name是一個(gè)變量,第二個(gè)參數(shù)list 是一個(gè)表(有序集合),第三個(gè)參數(shù)body是循環(huán)體。每次取得鏈表的一個(gè)元素,都會(huì)執(zhí)行循環(huán)體一次。 下例與上例作用相同:set b foreach i $aset b linsert $b 0 $i2。 foreach varlist1 list1 ?varlist2 list2 .? Body這種形式包含了第一種形式。第一個(gè)參數(shù)varlist1是一個(gè)循環(huán)變量列表,第二個(gè)參數(shù)是一個(gè)列表list1,varlist1中的變量會(huì)分別取list1中的值。body參數(shù)是循環(huán)體。 ?varlist2 list2 .?表示可以有多個(gè)變量列表和列表對(duì)出現(xiàn)。例如:set x
32、foreach i j a b c d e f lappend x $j $i這時(shí)總共有三次循環(huán),x的值為b a d c f e。set x foreach i a b c j d e f g lappend x $i $j這時(shí)總共有四次循環(huán),x的值為a d b e c f g。set x foreach i a b c j k d e f g lappend x $i $j $k這時(shí)總共有三次循環(huán),x的值為a d e b f g c 。3.2.4 break和continue命令 在循環(huán)體中,可以用break和continue命令中斷循環(huán)。其中break命令結(jié)束整個(gè)循環(huán)過(guò)程,并從循環(huán)中跳出,
33、continue只是結(jié)束本次循環(huán)。3.2.5 switch 命令和C語(yǔ)言中switch語(yǔ)句一樣,TCL中的switch命令也可以由if命令實(shí)現(xiàn)。只是書(shū)寫(xiě)起來(lái)較為煩瑣。 switch命令的語(yǔ)法為: switch ? options? string pattern body ? pattern body .? 第一個(gè)是可選參數(shù)options,表示進(jìn)行匹配的方式。TCL支持三種匹配方式:-exact方式,-glob方式,-regexp方式,缺省情況表示-glob方式。-exact方式表示的是精確匹配,-glob方式的匹配方式和string match 命令的匹配方式相同(第八節(jié)介紹),-regexp
34、方式是正規(guī)表達(dá)式的匹配方式(第八節(jié)介紹)。第二個(gè)參數(shù)string 是要被用來(lái)作測(cè)試的值,第三個(gè)參數(shù)是括起來(lái)的一個(gè)或多個(gè)元素對(duì),例:switch $x a -b incr t1c incr t2default incr t3其中a的后面跟一個(gè)表示使用和下一個(gè)模式相同的腳本。default表示匹配任意值。一旦switch命令 找到一個(gè)模式匹配,就執(zhí)行相應(yīng)的腳本,并返回腳本的值,作為switch命令的返回值。3.3 eval命令eval命令是一個(gè)用來(lái)構(gòu)造和執(zhí)行TCL腳本的命令,其語(yǔ)法為:eval arg ?arg .?它可以接收一個(gè)或多個(gè)參數(shù),然后把所有的參數(shù)以空格隔開(kāi)組合到一起成為一個(gè)腳本,然后對(duì)
35、這個(gè)腳本進(jìn)行求值。例如:eval set a 2 ;set b 443.4 source命令source命令讀一個(gè)文件并把這個(gè)文件的內(nèi)容作為一個(gè)腳本進(jìn)行求值。例如:source e:/tcl&c/hello.tcl 注意路徑的描述應(yīng)該和UNIX相同,使用/而不是。4 過(guò)程(procedure)TCL支持過(guò)程的定義和調(diào)用,在TCL中,過(guò)程可以看作是用TCL腳本實(shí)現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時(shí)候使用proc命令定義自己的過(guò)程,TCL中的過(guò)程類(lèi)似于C中的函數(shù)。4.1 過(guò)程定義和返回值TCL中過(guò)程是由proc命令產(chǎn)生的:例如:% proc add x y expr $x+$yp
36、roc命令的第一個(gè)參數(shù)是你要定義的過(guò)程的名字,第二個(gè)參數(shù)是過(guò)程的參數(shù)列表,參數(shù)之間用空格隔開(kāi),第三個(gè)參數(shù)是一個(gè)TCL腳本,代表過(guò)程體。 proc生成一個(gè)新的命令,可以象固有命令一樣調(diào)用:% add 1 2 3 在定義過(guò)程時(shí),你可以利用return命令在任何地方返回你想要的值。 return命令迅速中斷過(guò)程,并把它的參數(shù)作為過(guò)程的結(jié)果。例如:% proc abs x if $x = 0 return $x return expr -$x過(guò)程的返回值是過(guò)程體中最后執(zhí)行的那條命令的返回值。4.2 局部變量和全局變量 對(duì)于在過(guò)程中定義的變量,因?yàn)樗鼈冎荒茉谶^(guò)程中被訪問(wèn),并且當(dāng)過(guò)程退出時(shí)會(huì)被自動(dòng)刪除,所
37、以稱為局部變量;在所有過(guò)程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過(guò)程的內(nèi)部;全局變量的作用域則不包括所有過(guò)程的內(nèi)部。這一點(diǎn)和C語(yǔ)言有很大的不同. 如果我們想在過(guò)程內(nèi)部引用一個(gè)全局變量的值,可以使用global命令。例如:% set a 44% proc sample x global aincr a return expr $a+$x% sample 38%set a5 全局變量a在過(guò)程中被訪問(wèn)。在過(guò)程中對(duì)a的改變會(huì)直接反映到全局上。如果去掉語(yǔ)句global a,TCL會(huì)出錯(cuò),因?yàn)樗徽J(rèn)識(shí)變量a. 4.3 缺省
38、參數(shù)和可變個(gè)數(shù)參數(shù)TCL還提供三種特殊的參數(shù)形式:首先,你可以定義一個(gè)沒(méi)有參數(shù)的過(guò)程,例如:proc add expr 2+3其次,可以定義具有缺省參數(shù)值的過(guò)程,我們可以為過(guò)程的部分或全部參數(shù)提供缺省值,如果調(diào)用過(guò)程時(shí)未提供那些參數(shù)的值,那么過(guò)程會(huì)自動(dòng)使用缺省值賦給相應(yīng)的參數(shù)。和CC+中具有缺省參數(shù)值的函數(shù)一樣,有缺省值的參數(shù)只能位于參數(shù)列表的后部,即在第一個(gè)具有缺省值的參數(shù)后面的所有參數(shù),都只能是具有缺省值的參數(shù)。例如:proc add val1 val2 2 val3 3 expr $val1+$val2+$val3則:add 1 /值為6add 2 20 /值為25add 4 5 6 /
39、值為15另外,TCL的過(guò)程定義還支持可變個(gè)數(shù)的參數(shù),如果過(guò)程的最后一個(gè)參數(shù)是args, 那么就表示這個(gè)過(guò)程支持可變個(gè)數(shù)的參數(shù)調(diào)用。調(diào)用時(shí),位于args以前的參數(shù)象普通參數(shù)一樣處理,但任何附加的參數(shù)都需要在過(guò)程體中作特殊處理,過(guò)程的局部變量args將會(huì)被設(shè)置為一個(gè)列表,其元素就是所有附加的變量。如果沒(méi)有附加的變量,args就設(shè)置成一個(gè)空串,下面是一個(gè)例子:proc add val1 args set sum $val1 foreach i $args incr sum $i return $sum 則:add 2 /值為2add 2 3 4 5 6 /值為204.4 引用:upvar命令語(yǔ)法:upvar ?level? otherVar myVar ?otherVar myVar .?upvar命令使
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版美容美發(fā)行業(yè)員工社會(huì)保險(xiǎn)合同4篇
- 2025年度個(gè)人品牌重型機(jī)械抵押借款合同范本4篇
- 2025版企業(yè)新媒體營(yíng)銷(xiāo)策略執(zhí)行合同3篇
- 2025年度美容院美容院店務(wù)管理與顧客服務(wù)合同4篇
- 2025年香港勞務(wù)派遣與人力資源共享服務(wù)合同3篇
- 基于物聯(lián)網(wǎng)的智能農(nóng)業(yè)管理系統(tǒng)2025年度委托開(kāi)發(fā)合同
- 2025版停車(chē)場(chǎng)設(shè)施設(shè)備更新與改造合同范本2篇
- 2025年度餐飲業(yè)消防安全責(zé)任合同書(shū)3篇
- 退房時(shí)2025年度房屋損害賠償協(xié)議3篇
- 2024版快遞物流服務(wù)合同書(shū)
- 化學(xué)-河南省TOP二十名校2025屆高三調(diào)研考試(三)試題和答案
- 智慧農(nóng)貿(mào)批發(fā)市場(chǎng)平臺(tái)規(guī)劃建設(shè)方案
- 林下野雞養(yǎng)殖建設(shè)項(xiàng)目可行性研究報(bào)告
- 2023年水利部黃河水利委員會(huì)招聘考試真題
- Python編程基礎(chǔ)(項(xiàng)目式微課版)教案22
- 建筑施工中常見(jiàn)的安全問(wèn)題及解決方法
- 近五年重慶中考物理試題及答案2023
- 乳腺導(dǎo)管原位癌
- 冷庫(kù)管道應(yīng)急預(yù)案
- 《學(xué)習(xí)教育重要論述》考試復(fù)習(xí)題庫(kù)(共250余題)
- 網(wǎng)易云音樂(lè)用戶情感畫(huà)像研究
評(píng)論
0/150
提交評(píng)論