




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Tcl教程TCL語(yǔ)法腳本、命令和單詞符號(hào).2置換(substitution) .2注釋.5變量簡(jiǎn)單變量.5數(shù)組.6相關(guān)命令.6表達(dá)式操作數(shù).7運(yùn)算符和優(yōu)先級(jí).7數(shù)學(xué)函數(shù)8Listlist命令.10concat命令10lindex命令.11llength命令.11linsert命令.11lreplace命令.11lrange 命令11lappend命令.12lsearch 命令.12lsort命令.13split命令.13join命令.13控制流if命令.13循環(huán)命令:while 、for、 foreach.14eval命令.15source命令.16過(guò)程(procedure)過(guò)程定義和返回值1
2、6局部變量和全局變量.17缺省參數(shù)和可變個(gè)數(shù)參數(shù).17引用:upvar.18字符串操作format命令.19scan命令.20regexp命令regsub命令string命令文件訪問(wèn)文件名基本文件輸入輸出命令隨機(jī)文件訪問(wèn)當(dāng)前工作目錄文件操作和獲取文件信息錯(cuò)誤和異常錯(cuò)誤從TCL腳本中產(chǎn)生錯(cuò)誤使用catch捕獲錯(cuò)誤其他異常深入TCL查詢數(shù)組中的元素info命令TCL語(yǔ)法 > 腳本、命令和單詞符號(hào)一個(gè)TCL腳本可以包含一個(gè)或多個(gè)命令。命令之間必須用換行符或分號(hào)隔開,下面的兩個(gè)腳本都是合法的: set a 1 set b 2 或 set a 1;set b 2 TCL的每一個(gè)命令包含一個(gè)或幾個(gè)單
3、詞,第一個(gè)單詞代表命令名,另外的單詞則是這個(gè)命令的參數(shù),單詞之間必須用空格或TAB鍵隔開。 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)行處理。 TCL語(yǔ)法 > 置換(substitution)注:在下面的所有章節(jié)的例子中,''為TCL的命令提示符,輸入命令回車后,TCL會(huì)在接著
4、的一行輸出命令執(zhí)行結(jié)果。'/'后面是我自己加上的說(shuō)明,不是例子的一部分。 TCL解釋器在分析命令時(shí),把所有的命令參數(shù)都當(dāng)作字符串看待,例如: %set x 10 /定義變量x,并把x的值賦為10 10 %set y x+100 /y的值是x+100,而不是我們期望的110 x+100 上例的第二個(gè)命令中,x被看作字符串x+100的一部分,如果我們想使用x的值'10' ,就必須告訴TCL解釋器:我們?cè)谶@里期望的是變量x的值,而非字符'x'。怎么告訴TCL解釋器呢,這就要用到TCL語(yǔ)言中提供的置換功能。 TCL提供三種形式的置換:變量置換、命令置換和
5、反斜杠置換。每種置換都會(huì)導(dǎo)致一個(gè)或多個(gè)單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內(nèi)的每一個(gè)單詞中,而且置換可以嵌套。 變量置換(variable subtitution)變量置換由一個(gè)符號(hào)標(biāo)記,變量置換會(huì)導(dǎo)致變量的值插入一個(gè)單詞中。例如: %set y $x+100 /y的值是10+100,這里x被置換成它的值10 10100 這時(shí),y的值還不是我們想要的值110,而是10+100,因?yàn)門CL解釋器把10+100看成是一個(gè)字符串而不是表達(dá)式,y要想得到值110,還必須用命令置換,使得TCL會(huì)把10+100看成一個(gè)表達(dá)式并求值。 命令置換(command substitution)命令
6、置換是由括起來(lái)的TCL命令及其參數(shù),命令置換會(huì)導(dǎo)致某一個(gè)命令的所有或部分單詞被另一個(gè)命令的結(jié)果所代替。例如: %set y expr $x+100 110 y的值是110,這里當(dāng)TCL解釋器遇到字符''時(shí),它就會(huì)把隨后的expr作為一個(gè)命令名,從而激活與expr對(duì)應(yīng)的C/C+過(guò)程,并把'expr'和變量置換后得到的'10+110'傳遞給該命令過(guò)程進(jìn)行處理。 如果在上例中我們?nèi)サ?,那么TCL會(huì)報(bào)錯(cuò)。因?yàn)樵谡G闆r下,TCL解釋器只把命令行中的第一個(gè)單詞作為看作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。 注意,中必須是一個(gè)合法的TCL腳
7、本,長(zhǎng)度不限。中腳本的值為最后一個(gè)命令的返回值,例如: %set y expr $x+100;set b 300 /y的值為300,因?yàn)閟et b 300的返回值為300 300 有了命令置換,實(shí)際上就表示命令之間是可以嵌套的,即一個(gè)命令的結(jié)果可以作為別的命令的參數(shù)。 反斜杠置換(backslash substitution)TCL語(yǔ)言中的反斜杠置換類似于C語(yǔ)言中反斜杠的用法,主要用于在單詞符號(hào)中插入諸如換行符、空格、$等被TCL解釋器當(dāng)作特殊符號(hào)對(duì)待的字符。例如: set msg multiple space /msg的值為multiple space。 如果沒(méi)有''的話,T
8、CL會(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 money $3333 nArray a2 /這個(gè)命令的執(zhí)行結(jié)果為:money $3333 Array a2 這里的$不再被當(dāng)作變量置換符。 TCL支持以下的反斜杠置換: Backslash Sequence Replaced By a Audible alert (0x7) b Backspace (0x8) f Form fee
9、d (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 d's) xhh Hex value given by hh (any number of h's) newline space A single space character. 例如: set a x48 /對(duì)應(yīng) xhh H /十六進(jìn)制的48正好是72,對(duì)應(yīng)H set a 110 /對(duì)應(yīng) ddd H /八進(jìn)制的110正
10、好是72,對(duì)應(yīng)H set a expr / 對(duì)應(yīng)newline space,一個(gè)命令可以用newline轉(zhuǎn)到下一行繼續(xù) 2+3 5 雙引號(hào)和花括號(hào) 除了使用反斜杠外,TCL提供另外兩種方法來(lái)使得解釋器把分隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號(hào)和花括號(hào)()。 TCL解釋器對(duì)雙引號(hào)中的各種分隔符將不作處理,但是對(duì)換行符 及和兩種置換符會(huì)照常處理。例如: %set x 100 100 %set y "$x ddd" 100 ddd 而在花括號(hào)中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會(huì)對(duì)其作特殊處理。 %set y /n$x e
11、xpr 10+100 /n$x expr 10+100 TCL語(yǔ)言教程 > TCL語(yǔ)法 > 注釋TCL中的注釋符是'',''和直到所在行結(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對(duì)注釋將不作任何處理。不過(guò),要注意的是,''必須出現(xiàn)在TCL解釋器期望命令的第一個(gè)字符出現(xiàn)的地方,才被當(dāng)作注釋。 例如: %This is a comment %set a 100 # Not a comment wrong # args: should be "set varName ?newValue?" %set b 101 ;
12、# this is a comment 101 第二行中''就不被當(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)作注釋了。 變量 > 簡(jiǎn)單變量一個(gè)TCL的簡(jiǎn)單變量包含兩個(gè)部分:名字和值。名字和值都可以是任意字符串。例如一個(gè)名為 “1323 7&*: hdgg"的變量在TCL中都是合法的。不過(guò)為了更好的使用置換(substitution
13、),變量名最好按CC+語(yǔ)言中標(biāo)識(shí)符的命名規(guī)則命名。 TCL解釋器在分析一個(gè)變量置換時(shí),只把從符號(hào)往后直到第一個(gè)不是字母、數(shù)字或下劃線的字符之間的單詞符號(hào)作為要被置換的變量的名字。例如: % set a 2 2 set a.1 4 4 % set b $a.1 2.1 在最后一個(gè)命令行,我們希望把變量a.1的值付給b,但是TCL解釋器在分析時(shí)只把$符號(hào)之后直到第一個(gè)不是字母、數(shù)字或下劃線的字符(這里是'.')之間的單詞符號(hào)(這里是'a')當(dāng)作要被置換的變量的名字,所以TCL解釋器把a(bǔ)置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。 當(dāng)然,如果變
14、量名中有不是字母、數(shù)字或下劃線的字符,又要用置換,可以用花括號(hào)把變量名括起來(lái)。例如: %set b $a.1 4 TCL中的set命令能生成一個(gè)變量、也能讀取或改變一個(gè)變量的值。例如: set a kdfj kjdf kdfj kjdf 如果變量a還沒(méi)有定義,這個(gè)命令將生成 變量a,并將其值置為kdfj kjdf,若a已定義,就簡(jiǎn)單的把a(bǔ)的值置為kdfj kjdf。 set a kdfj kjdf 這個(gè)只有一個(gè)參數(shù)的set命令讀取a的當(dāng)前值kdfj kjdf。 變量 > 數(shù)組數(shù)組是一些元素的集合。TCL的數(shù)組和普通計(jì)算機(jī)語(yǔ)言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨(dú)聲明一個(gè)數(shù)組,數(shù)組只能
15、和數(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)單變量類似。例: set a monday set day(monday) 1 set b $day(monday) /b的值為1,即d
16、ay(monday)的值。 set c $day($a) /c的值為1,即day(monday)的值。 TCL不能支持復(fù)雜的數(shù)據(jù)類型,這是一個(gè)很大的缺憾,也是TCL受指責(zé)很多的方面。但是TCL的一個(gè)擴(kuò)展ITCL填補(bǔ)了這個(gè)缺憾變量 > 相關(guān)命令set這個(gè)命令在3.1已有詳細(xì)介紹。 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ù)組,只需給出數(shù)組
17、的名字。例如: %puts $day(monday) can't read "day(monday)": no such element in array % puts $day(tuesday) 2 %unset day % puts $day(tuesday) can't read "day(tuesday)": no such variable append和incr這兩個(gè)命令提供了改變變量的值的簡(jiǎn)單手段。 append命令把文本加到一個(gè)變量的后面,例如: % set txt hello hello % append txt &qu
18、ot;! How are you" hello! How are you incr命令把一個(gè)變量值加上一個(gè)整數(shù)。incr要求變量原來(lái)的值和新加的值都必須是整數(shù)。 %set b a a % incr b expected integer but got "a" %set b 2 2 %incr b 3 5 表達(dá)式 > 操作數(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ù)的寫法與ANSI C中完全一樣。如: 2.
19、1 7.9e+12 6e4 3. 表達(dá)式 > 運(yùn)算符和優(yōu)先級(jí)下面的表格中列出了TCL中用到的運(yùn)算符,它們的語(yǔ)法形式和用法跟ANSI C中很相似。這里就不一一介紹。下表中的運(yùn)算符是按優(yōu)先級(jí)從高到低往下排列的。同一格中的運(yùn)算符優(yōu)先級(jí)相同。 語(yǔ)法形式結(jié)果操作數(shù)類型-a!aa負(fù)a非aint,floatint,floatinta*ba/ba%b乘除取模int,floatint,floatinta+ba-b加減int,floatint,floata<<ba>>b左移位右移位intinta<ba>ba<=ba>=b小于大于小于等于大于等于int,floa
20、t,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選擇運(yùn)算a:int,float表達(dá)式 > 數(shù)學(xué)函數(shù)TCL支持常用的數(shù)學(xué)函數(shù),表達(dá)式中數(shù)學(xué)函數(shù)的寫法類似于CC+語(yǔ)言的寫法,數(shù)學(xué)函數(shù)的參數(shù)可以是任意表達(dá)式,多個(gè)參數(shù)之間用逗號(hào)隔開。例如: %set x 2 2 % expr 2* sin
21、($x<3) 1.68294196962 其中expr是TCL的一個(gè)命令,語(yǔ)法為: expr arg ?arg .? 兩個(gè) ?之間的參數(shù)表示可省,后面介紹命令時(shí)對(duì)于可省參數(shù)都使用這種表示形式。 expr可以有一個(gè)或多個(gè)參數(shù),它把所有的參數(shù)組合到一起,作為一個(gè)表達(dá)式,然后求值: %expr 12*3 7 %expr 1 +2 *3 7 需要注意的一點(diǎn)是,數(shù)學(xué)函數(shù)并不是命令,只在表達(dá)式中出現(xiàn)才有意義。 TCL中支持的數(shù)學(xué)函數(shù)如下 abs( x) Absolute value of x. acos( x) Arc cosine of x, in the range 0 to p. asin(
22、x) Arc sine of x, in the range -p/2 to p/2. atan( x) Arc tangent of x, in the range -p/2 to p/2. atan2( x, y) Arc tangent of x/ y, in the range -p/2 to p/2. ceil( x) Smallest integer not less than x. cos( x) Cosine of x ( x in radians). cosh( x) Hyperbolic cosine of x. double( i) Real value equal to
23、 integer i. exp( x) e raised to the power x. floor( x) Largest integer not greater than x. fmod( x, y) Floating-point remainder of x divided by y. hypot( x, y) Square root of ( x 2 + y 2 ). int( x) Integer value produced by truncating x. log( x) Natural logarithm of x. log10( x) Base 10 logarithm of
24、 x. pow( x, y) x raised to the power y. round( x) Integer value produced by rounding x. sin( x) Sine of x ( x in radians). sinh( x) Hyperbolic sine of x. sqrt( x) Square root of x. tan( x) Tangent of x ( x in radians). tanh( x) Hyperbolic tangent of x. TCL中有很多命令都以表達(dá)式作為參數(shù)。最典型的是expr命令,另外if、while、for等循
25、環(huán)控制命令的循環(huán)控制中也都使用表達(dá)式作為參數(shù)。 List > List命令list這個(gè)概念在TCL中是用來(lái)表示集合的。TCL中l(wèi)ist是由一堆元素組成的有序集合,list可以嵌套定義,list每個(gè)元素可以是任意字符串,也可以是list。下面都是TCL中的合法的list: /空l(shuí)ist a b c d a b c d /list可以嵌套 list是TCL中比較重要的一種數(shù)據(jù)結(jié)構(gòu),對(duì)于編寫復(fù)雜的腳本有很大的幫助,TCL提供了很多基本命令對(duì)list進(jìn)行操作,下面一一介紹: list命令語(yǔ)法: list ? value value.? 這個(gè)命令生成一個(gè)list,list的元素就是所有的value
26、。例: % list 1 2 3 4 1 2 3 4 List > concat命令語(yǔ)法:concat list ?list.? 這個(gè)命令把多個(gè)list合成一個(gè)list,每個(gè)list變成新list的一個(gè)元素。 List > lindex命令語(yǔ)法:lindex list index 返回list的第index個(gè)(0-based)元素。例: % lindex 1 2 3 4 2 3 4 List > llength命令語(yǔ)法:llength list 返回list的元素個(gè)數(shù)。例 % llength 1 2 3 4 3 List > linsert命令語(yǔ)法:linsert li
27、st index value ?value.? 返回一個(gè)新串,新串是把所有的value參數(shù)值插入list的第index個(gè)(0-based)元素之前得到。例: % linsert 1 2 3 4 1 7 8 9 10 1 7 8 9 10 2 3 4 List > lreplace命令語(yǔ)法:lreplace list first last ?value value .? 返回一個(gè)新串,新串是把list的第firs (0-based)t到第last 個(gè)(0-based)元素用所有的value參數(shù)替換得到的。如果沒(méi)有value參數(shù),就表示刪除第first到第last個(gè)元素。例: % lrepl
28、ace 1 7 8 9 10 2 3 4 3 3 1 7 8 2 3 4 % lreplace 1 7 8 2 3 4 4 4 4 5 6 1 7 8 2 4 5 6 List > lrange命令語(yǔ)法:lrange list first last 返回list的第first (0-based)到第last (0-based)元素組成的串,如果last的值是end。就是從第first個(gè)直到串的最后。 例: % lrange 1 7 8 2 4 5 6 3 end 2 4 5 6 List > lappend命令語(yǔ)法:lappend varname value ?value.? 把每
29、個(gè)value的值作為一個(gè)元素附加到變量varname后面,并返回變量的新值,如果varname不存在,就生成這個(gè)變量。例: % lappend a 1 2 3 1 2 3 % set a 1 2 3 List > lsearch命令語(yǔ)法:lsearch ?-exact? ?-glob? ?-regexp? list pattern 返回list中第一個(gè)匹配模式pattern的元素的索引,如果找不到匹配就返回-1。-exact、-glob、 -regexp是三種模式匹配的技術(shù)。-exact表示精確匹配;-glob的匹配方式和string match命令的匹配方式相同,將在后面第八節(jié)介紹st
30、ring命令時(shí)介紹;-regexp表示正規(guī)表達(dá)式匹配,將在第八節(jié)介紹regexp命令時(shí)介紹。缺省時(shí)使用-glob匹配。例: % set a how are you how are you % lsearch $a y* 2 % lsearch $a y? -1 List > lsort命令語(yǔ)法:lsort ?options? list 這個(gè)命令返回把list排序后的串。options可以是如下值: -ascii 按ASCII字符的順序排序比較.這是缺省情況。-dictionary 按字典排序,與-ascii不同的地方是: (1)不考慮大小寫 (2)如果元素中有數(shù)字的話,數(shù)字被當(dāng)作整數(shù)來(lái)排
31、序. 因此:bigBoy排在bigbang和bigboy之間, x10y 排在x9y和x11y之間. -integer 把list的元素轉(zhuǎn)換成整數(shù),按整數(shù)排序. -real 把list的元素轉(zhuǎn)換成浮點(diǎn)數(shù),按浮點(diǎn)數(shù)排序. -increasing 升序(按ASCII字符比較) -decreasing 降序(按ASCII字符比較) -command command TCL自動(dòng)利用command 命令把每?jī)蓚€(gè)元素一一比較,然后給出排序結(jié)果。 List > split命令語(yǔ)法:split string ?splitChars? 把字符串string按分隔符splitChars分成一個(gè)個(gè)單詞,返回由
32、這些單詞組成的串。如果splitChars 是一個(gè)空字符,string被按字符分開。如果splitChars沒(méi)有給出,以空格為分隔符。例: % split "how.are.you" . how are you % split "how are you" how are you % split "how are you" h o w a r e y o u List > join命令語(yǔ)法:join list ?joinString? join命令是命令的逆。這個(gè)命令把list的所有元素合并到一個(gè)字符串中,中間以joinStrin
33、g分開。缺省的joinString是空格。例: % join h o w a r e y o u how are you % join how are you . how.are.you 控制流 > if命令TCL中的控制流和C語(yǔ)言類似,包括if、while、for、foreach、switch、break、continue等命令。語(yǔ)法: if test1 body1 ?elseif test2 body2 elseif. ? ?else bodyn? TCL先把test1當(dāng)作一個(gè)表達(dá)式求值,如果值非0,則把body1當(dāng)作一個(gè)腳本執(zhí)行并返回所得值,否則把test2當(dāng)作一個(gè)表達(dá)式求值,如果
34、值非0,則把body2當(dāng)作一個(gè)腳本執(zhí)行并返回所得值。例如: if $x>0 . elseif $x1 . elseif $x2 . else . 注意,上例中''一定要寫在上一行,因?yàn)槿绻贿@樣,TCL 解釋器會(huì)認(rèn)為if命令在換行符處已結(jié)束,下一行會(huì)被當(dāng)成新的命令,從而導(dǎo)致錯(cuò)誤的結(jié)果。在下面的循環(huán)命令的書寫中也要注意這個(gè)問(wèn)題。書寫中還要注意的一個(gè)問(wèn)題是if 和之間應(yīng)該有一個(gè)空格,否則TCL解釋器會(huì)把'if'作為一個(gè)整體當(dāng)作一個(gè)命令名,從而導(dǎo)致錯(cuò)誤。 控制流 > 循環(huán)命令循環(huán)命令包括while、for、foreach等。while命令語(yǔ)法為: whil
35、e 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 -1 while $i>=0 lappend b lindex $a $i incr i -1 for命令語(yǔ)法為: for init test reinit body 參數(shù)init是一個(gè)初始化腳本,第二個(gè)參數(shù)test是一個(gè)表達(dá)式,用來(lái)決定循環(huán)什么時(shí)候中斷,第三個(gè)參數(shù)rei
36、nit是一個(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 foreach命令這個(gè)命令有兩種語(yǔ)法形式 1、 foreach varName list body 第一個(gè)參數(shù)varName是一個(gè)變量,第二個(gè)參數(shù)list 是一個(gè)表(有序集合),第三個(gè)參數(shù)body是循環(huán)體。每次取得鏈表的一個(gè)元素,都會(huì)執(zhí)行循環(huán)體一次。 下例與上例作用相同: set b " " foreac
37、h i $a set b linsert $b 0 $i 2、 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 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 f
38、oreach 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 "。 break和continue命令在循環(huán)體中,可以用break和continue命令中斷循環(huán)。其中break命令結(jié)束整個(gè)循環(huán)過(guò)程,并從循環(huán)中跳出,continue只是結(jié)束本次循環(huán)。 switch 命令和C語(yǔ)言中switch語(yǔ)句一樣,TCL中的swi
39、tch命令也可以由if命令實(shí)現(xiàn)。只是書寫起來(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方式是正規(guī)表達(dá)式的匹配方式(第八節(jié)介紹)。第二個(gè)參數(shù)string 是要被用來(lái)作測(cè)試的值,第三個(gè)參數(shù)是括起來(lái)的一個(gè)
40、或多個(gè)元素對(duì),例: switch $x a - b incr t1 c incr t2 default incr t3 其中a的后面跟一個(gè)''表示使用和下一個(gè)模式相同的腳本。default表示匹配任意值。一旦switch命令 找到一個(gè)模式匹配,就執(zhí)行相應(yīng)的腳本,并返回腳本的值,作為switch命令的返回值。 控制流 > eval命令eval命令是一個(gè)用來(lái)構(gòu)造和執(zhí)行TCL腳本的命令,其語(yǔ)法為: eval arg ?arg .? 它可以接收一個(gè)或多個(gè)參數(shù),然后把所有的參數(shù)以空格隔開組合到一起成為一個(gè)腳本,然后對(duì)這個(gè)腳本進(jìn)行求值。例如: eval set a 2 ;set b
41、4 4 控制流 > source命令sosource命令讀一個(gè)文件并把這個(gè)文件的內(nèi)容作為一個(gè)腳本進(jìn)行求值。例如: source e:/tcl&c/hello.tcl 注意路徑的描述應(yīng)該和UNIX相同,使用'/'而不是''。 過(guò)程(procedure) > 過(guò)程定義和返回值TCL支持過(guò)程的定義和調(diào)用,在TCL中,過(guò)程可以看作是用TCL腳本實(shí)現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時(shí)候使用proc命令定義自己的過(guò)程,TCL中的過(guò)程類似于C中的函數(shù)。 TCL中過(guò)程是由proc命令產(chǎn)生的: 例如: % proc add x y expr
42、$x+$y proc命令的第一個(gè)參數(shù)是你要定義的過(guò)程的名字,第二個(gè)參數(shù)是過(guò)程的參數(shù)列表,參數(shù)之間用空格隔開,第三個(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í)行的那條命令的返回值。 過(guò)程(procedure) > 局部變量和全局變量對(duì)于在過(guò)程中定義的變量,因
43、為它們只能在過(guò)程中被訪問(wèn),并且當(dāng)過(guò)程退出時(shí)會(huì)被自動(dòng)刪除,所以稱為局部變量;在所有過(guò)程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過(guò)程的內(nèi)部;全局變量的作用域則不包括所有過(guò)程的內(nèi)部。這一點(diǎn)和C語(yǔ)言有很大的不同. 如果我們想在過(guò)程內(nèi)部引用一個(gè)全局變量的值,可以使用global命令。例如: % set a 4 4 % proc sample x global a incr a return expr $a+$x % sample 3 8 %set a 5 全局變量a在過(guò)程中被訪問(wèn)。在過(guò)程中對(duì)a的改變會(huì)直接反映到全局上。如果
44、去掉語(yǔ)句global a,TCL會(huì)出錯(cuò),因?yàn)樗徽J(rèn)識(shí)變量a。 過(guò)程(procedure) > 缺省參數(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 ex
45、pr $val1+$val2+$val3 則: add 1 /值為6 add 2 20 /值為25 add 4 5 6 /值為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 $
46、i return $sum 則: add 2 /值為2 add 2 3 4 5 6 /值為20 過(guò)程(procedure) > 引用:upvar命令語(yǔ)法:upvar ?level? otherVar myVar ?otherVar myVar .? upvar命令使得用戶可以在過(guò)程中對(duì)全局變量或其他過(guò)程中的局部變量進(jìn)行訪問(wèn)。 upvar命令的第一個(gè)參數(shù)otherVar是我們希望以引用方式訪問(wèn)的參數(shù)的名字,第二個(gè)參數(shù)myVar 是這個(gè)過(guò)程中的局部變量的名字,一旦使用了upvar 命令把otherVar 和myVar 綁定,那么在過(guò)程中對(duì)局部變量myVar 的讀寫就相當(dāng)于對(duì)這個(gè)過(guò)程的調(diào)用者中
47、otherVar 所代表的局部變量的讀寫。下面是一個(gè)例子: % proc temp arg upvar $arg b set b expr $b+2 % proc myexp var set a 4 temp a return expr $var+$a 則: % myexp 7 13 這個(gè)例子中,upvar 把$arg(實(shí)際上是過(guò)程myexp中的變量a)和過(guò)程temp中的變量b綁定,對(duì)b的讀寫就相當(dāng)于對(duì)a的讀寫。 upvar命令語(yǔ)法中的level參數(shù)表示:調(diào)用upvar命令的過(guò)程相對(duì)于我們希望引用的變量myVar在調(diào)用棧中相對(duì)位置。例如: upvar 2 other x 這個(gè)命令使得當(dāng)前過(guò)程的
48、調(diào)用者的調(diào)用者中的變量other,可以在當(dāng)前過(guò)程中利用x訪問(wèn)。缺省情況下,level的值為1,即當(dāng)前過(guò)程(上例中的temp)的調(diào)用者(上例中的myexp)中的變量(上例中myexp的a)可以在當(dāng)前過(guò)程中利用局部變量(上例中temp的b)訪問(wèn)。 如果要訪問(wèn)全局變量可以這樣寫: upvar 0 other x 那么,不管當(dāng)前過(guò)程處于調(diào)用棧中的什么位置,都可以在當(dāng)前過(guò)程中利用x訪問(wèn)全局變量other。 字符串操作 > format命令因?yàn)門CL把所有的輸入都當(dāng)作字符串看待,所以TCL提供了較強(qiáng)的字符串操作功能,TCL中與字符串操作有關(guān)的命令有:string、format、regexp、regs
49、ub、scan等。 format命令語(yǔ)法:format formatstring ?vlue value.? format命令類似于ANSIC中的sprintf函數(shù)和MFC中CString類提供的Format成員函數(shù)。它按formatstring提供的格式,把各個(gè)value的值組合到formatstring中形成一個(gè)新字符串,并返回。例如: %set name john John %set age 20 20 %set msg format "%s is %d years old" $name $age john is 20 years old 字符串操作 > sca
50、n命令語(yǔ)法:scan string format varName ?varName .? scan命令可以認(rèn)為是format命令的逆,其功能類似于ANSI C中的sscanf函數(shù)。它按format提供的格式分析string字符串,然后把結(jié)果存到變量varName中,注意除了空格和TAB鍵之外,string 和format中的字符和'%'必須匹配。例如: % scan "some 26 34" "some %d %d" a b 2 % set a 26 % set b 34 % scan "12.34.56.78" &q
51、uot;%d.%d.%d.%d" c d e f 4 % puts format "the value of c is %d,d is %d,e is %d ,f is %d" $c $d $e $f the value of c is 12,d is 34,e is 56 ,f is 78 scan命令的返回值是匹配的變量個(gè)數(shù)。而且,我們發(fā)現(xiàn),如果變量varName不存在的話,TCL會(huì)自動(dòng)聲明該變量。 字符串操作 > regexp命令語(yǔ)法:regexp ?switchs? ?-? exp string ?matchVar? ?subMatchVar sub
52、MatchVar.? regexp命令用于判斷正規(guī)表達(dá)式exp是否全部或部分匹配字符串string,匹配返回1,否則0。 在正規(guī)表達(dá)式中,一些字符具有特殊的含義,下表一一列出,并給予了解釋。 字符意義.匹配任意單個(gè)字符表示從頭進(jìn)行匹配$表示從末尾進(jìn)行匹配x匹配字符x,這可以抑制字符x的含義chars匹配字符集合chars中給出的任意字符,如果chars中的第一個(gè)字符是,表示匹配任意不在chars中的字符,chars的表示方法支持a-z之類的表示。(regexp)把regexp作為一個(gè)單項(xiàng)進(jìn)行匹配*對(duì)*前面的項(xiàng)進(jìn)行0次或多次匹配+對(duì)前面的項(xiàng)進(jìn)行1次或多次匹配?對(duì)?前面的項(xiàng)進(jìn)行0次或1次匹配reg
53、exp1|regexp2匹配regexp1或regexp2中的一項(xiàng)下面的一個(gè)例子是從Tcl and Tk ToolKit中摘下來(lái)的,下面進(jìn)行說(shuō)明: (0x)?0-9a-fA-F+|0-9+)$ 這個(gè)正規(guī)表達(dá)式匹配任何十六進(jìn)制或十進(jìn)制的整數(shù)。 兩個(gè)正規(guī)表達(dá)式以|分開(0x)?0-9a-fA-F+和0-9+,表示可以匹配其中的任何一個(gè),事實(shí)上前者匹配十六進(jìn)制,后者匹配的十進(jìn)制。 表示必須從頭進(jìn)行匹配,從而上述正規(guī)表達(dá)式不匹配jk12之類不是以0x或數(shù)字開頭的串。 表示必須從末尾開始匹配,從而上述正規(guī)表達(dá)式不匹配12jk之類不是數(shù)字或a-fA-F結(jié)尾的串。 下面以(0x)?0-9a-fA-F+ 進(jìn)行說(shuō)明,(0x)表示
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 濮陽(yáng)縣2025年五年級(jí)數(shù)學(xué)第二學(xué)期期末監(jiān)測(cè)模擬試題含答案
- 提升自動(dòng)化水平選擇好的電磁閥解決方案
- 供應(yīng)商選擇與評(píng)估管理制度制度
- 投影水幕設(shè)計(jì)施工方案
- 寧波單層廠房施工方案
- 電力搶修施工方案
- 汽車尾燈資料
- 2025年家居業(yè)務(wù)面試題及答案
- 6個(gè)紅包紙折燈籠的制作方法
- 5年級(jí)下冊(cè)英語(yǔ)單詞第三單元帶讀音朗讀
- 勞務(wù)派遣勞務(wù)外包項(xiàng)目方案投標(biāo)文件(技術(shù)方案)
- 云南省教育科學(xué)規(guī)劃課題開題報(bào)告 - 云南省教育科學(xué)研究院
- 03J111-1輕鋼龍骨內(nèi)隔墻
- SCL-90心理測(cè)試試卷
- 法語(yǔ)冠詞總結(jié)
- 弱電工程驗(yàn)收?qǐng)?bào)告模板
- 煤礦用80開關(guān)(QBZ80、120、200)
- 《并購(gòu)專題》PPT課件.ppt
- 初一趣味英語(yǔ)競(jìng)賽PPT課件
- 柑橘種植示范園項(xiàng)目可行性研究報(bào)告-用于立項(xiàng)備案
- IPC-A-610E培訓(xùn)教材(完整版)
評(píng)論
0/150
提交評(píng)論