Tcl腳本語言教程55頁_第1頁
Tcl腳本語言教程55頁_第2頁
Tcl腳本語言教程55頁_第3頁
Tcl腳本語言教程55頁_第4頁
Tcl腳本語言教程55頁_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Tcl教程TCL語法腳本、命令和單詞符號.2置換(substitution) .2注釋.5變量簡單變量.5數(shù)組.6相關命令.6表達式操作數(shù).7運算符和優(yōu)先級.7數(shù)學函數(shù)8Listlist命令.10concat命令10lindex命令.11llength命令.11linsert命令.11lreplace命令.11lrange 命令11lappend命令.12lsearch 命令.12lsort命令.13split命令.13join命令.13控制流if命令.13循環(huán)命令:while 、for、 foreach.14eval命令.15source命令.16過程(procedure)過程定義和返回值1

2、6局部變量和全局變量.17缺省參數(shù)和可變個數(shù)參數(shù).17引用:upvar.18字符串操作format命令.19scan命令.20regexp命令regsub命令string命令文件訪問文件名基本文件輸入輸出命令隨機文件訪問當前工作目錄文件操作和獲取文件信息錯誤和異常錯誤從TCL腳本中產(chǎn)生錯誤使用catch捕獲錯誤其他異常深入TCL查詢數(shù)組中的元素info命令TCL語法 腳本、命令和單詞符號一個TCL腳本可以包含一個或多個命令。命令之間必須用換行符或分號隔開,下面的兩個腳本都是合法的: set a 1 set b 2 或 set a 1;set b 2 TCL的每一個命令包含一個或幾個單詞,第一個

3、單詞代表命令名,另外的單詞則是這個命令的參數(shù),單詞之間必須用空格或TAB鍵隔開。 TCL解釋器對一個命令的求值過程分為兩部分:分析和執(zhí)行。在分析階段,TCL 解釋器運用規(guī)則把命令分成一個個獨立的單詞,同時進行必要的置換(substitution); 在執(zhí)行階段,TCL 解釋器會把第一個單詞當作命令名,并查看這個命令是否有定義,如果有定義就激活這個命令對應的C/C+過程,并把所有的單詞作為參數(shù)傳遞給該命令過程,讓命令過程進行處理。 TCL語法 置換(substitution)注:在下面的所有章節(jié)的例子中,為TCL的命令提示符,輸入命令回車后,TCL會在接著的一行輸出命令執(zhí)行結果。/后面是我自己加

4、上的說明,不是例子的一部分。 TCL解釋器在分析命令時,把所有的命令參數(shù)都當作字符串看待,例如: %set x 10 /定義變量x,并把x的值賦為10 10 %set y x+100 /y的值是x+100,而不是我們期望的110 x+100 上例的第二個命令中,x被看作字符串x+100的一部分,如果我們想使用x的值10 ,就必須告訴TCL解釋器:我們在這里期望的是變量x的值,而非字符x。怎么告訴TCL解釋器呢,這就要用到TCL語言中提供的置換功能。 TCL提供三種形式的置換:變量置換、命令置換和反斜杠置換。每種置換都會導致一個或多個單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內的每一個

5、單詞中,而且置換可以嵌套。 變量置換(variable subtitution)變量置換由一個符號標記,變量置換會導致變量的值插入一個單詞中。例如: %set y $x+100 /y的值是10+100,這里x被置換成它的值10 10100 這時,y的值還不是我們想要的值110,而是10+100,因為TCL解釋器把10+100看成是一個字符串而不是表達式,y要想得到值110,還必須用命令置換,使得TCL會把10+100看成一個表達式并求值。 命令置換(command substitution)命令置換是由括起來的TCL命令及其參數(shù),命令置換會導致某一個命令的所有或部分單詞被另一個命令的結果所代替

6、。例如: %set y expr $x+100 110 y的值是110,這里當TCL解釋器遇到字符時,它就會把隨后的expr作為一個命令名,從而激活與expr對應的C/C+過程,并把expr和變量置換后得到的10+110傳遞給該命令過程進行處理。 如果在上例中我們去掉,那么TCL會報錯。因為在正常情況下,TCL解釋器只把命令行中的第一個單詞作為看作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。 注意,中必須是一個合法的TCL腳本,長度不限。中腳本的值為最后一個命令的返回值,例如: %set y expr $x+100;set b 300 /y的值為300,因為set b 300的返回

7、值為300 300 有了命令置換,實際上就表示命令之間是可以嵌套的,即一個命令的結果可以作為別的命令的參數(shù)。 反斜杠置換(backslash substitution)TCL語言中的反斜杠置換類似于C語言中反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、$等被TCL解釋器當作特殊符號對待的字符。例如: set msg multiple space /msg的值為multiple space。 如果沒有的話,TCL會報錯,因為解釋器會把這里最后兩個單詞之間的空格認為是分隔符,于是發(fā)現(xiàn)set命令有多于兩個參數(shù),從而報錯。加入了后,空格不被當作分隔符,multiple space被認為是一個

8、單詞(word)。又例如: %set msg money $3333 nArray a2 /這個命令的執(zhí)行結果為:money $3333 Array a2 這里的$不再被當作變量置換符。 TCL支持以下的反斜杠置換: Backslash Sequence Replaced By a 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

9、(one, two, or three ds) xhh Hex value given by hh (any number of hs) newline space A single space character. 例如: set a x48 /對應 xhh H /十六進制的48正好是72,對應H set a 110 /對應 ddd H /八進制的110正好是72,對應H set a expr / 對應newline space,一個命令可以用newline轉到下一行繼續(xù) 2+3 5 雙引號和花括號 除了使用反斜杠外,TCL提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當作普通字符,

10、而不作特殊處理,這就要使用雙引號和花括號()。 TCL解釋器對雙引號中的各種分隔符將不作處理,但是對換行符 及和兩種置換符會照常處理。例如: %set x 100 100 %set y $x ddd 100 ddd 而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會對其作特殊處理。 %set y /n$x expr 10+100 /n$x expr 10+100 TCL語言教程 TCL語法 注釋TCL中的注釋符是,和直到所在行結尾的所有字符都被TCL看作注釋,TCL解釋器對注釋將不作任何處理。不過,要注意的是,必須出現(xiàn)在TCL解釋器期望命令的第一個字符出現(xiàn)的地方,才被

11、當作注釋。 例如: %This is a comment %set a 100 # Not a comment wrong # args: should be set varName ?newValue? %set b 101 ; # this is a comment 101 第二行中就不被當作注釋符,因為它出現(xiàn)在命令的中間,TCL解釋器把它和后面的字符當作命令的參數(shù)處理,從而導致錯誤。而第四行的就被作為注釋,因為前一個命令已經(jīng)用一個分號結束,TCL解釋器期望下一個命令接著出現(xiàn)?,F(xiàn)在在這個位置出現(xiàn)#,隨后的字符就被當作注釋了。 變量 簡單變量一個TCL的簡單變量包含兩個部分:名字和值。名字和

12、值都可以是任意字符串。例如一個名為 “1323 7&*: hdgg的變量在TCL中都是合法的。不過為了更好的使用置換(substitution),變量名最好按CC+語言中標識符的命名規(guī)則命名。 TCL解釋器在分析一個變量置換時,只把從符號往后直到第一個不是字母、數(shù)字或下劃線的字符之間的單詞符號作為要被置換的變量的名字。例如: % set a 2 2 set a.1 4 4 % set b $a.1 2.1 在最后一個命令行,我們希望把變量a.1的值付給b,但是TCL解釋器在分析時只把$符號之后直到第一個不是字母、數(shù)字或下劃線的字符(這里是.)之間的單詞符號(這里是a)當作要被置換的變量的名字,

13、所以TCL解釋器把a置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。 當然,如果變量名中有不是字母、數(shù)字或下劃線的字符,又要用置換,可以用花括號把變量名括起來。例如: %set b $a.1 4 TCL中的set命令能生成一個變量、也能讀取或改變一個變量的值。例如: set a kdfj kjdf kdfj kjdf 如果變量a還沒有定義,這個命令將生成 變量a,并將其值置為kdfj kjdf,若a已定義,就簡單的把a的值置為kdfj kjdf。 set a kdfj kjdf 這個只有一個參數(shù)的set命令讀取a的當前值kdfj kjdf。 變量 數(shù)組數(shù)組是一些元素的集合。

14、TCL的數(shù)組和普通計算機語言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨聲明一個數(shù)組,數(shù)組只能和數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組名和數(shù)組中元素的名字,TCL中數(shù)組元素的名字(下標可以為任何字符串。例如: set day(monday) 1 set day(tuesday) 2 第一個命令生成一個名為day的數(shù)組,同時在數(shù)組中生成一個名為monday的數(shù)組元素,并把值置為1,第二個命令生成一個名為tuesday的數(shù)組元素,并把值置為2。 簡單變量的置換已經(jīng)在前一節(jié)討論過,這里講一下數(shù)組元素的置換。除了有括號之外,數(shù)組元素的置換和簡單變量類似。例: set a monday

15、set day(monday) 1 set b $day(monday) /b的值為1,即day(monday)的值。 set c $day($a) /c的值為1,即day(monday)的值。 TCL不能支持復雜的數(shù)據(jù)類型,這是一個很大的缺憾,也是TCL受指責很多的方面。但是TCL的一個擴展ITCL填補了這個缺憾變量 相關命令set這個命令在3.1已有詳細介紹。 unset這個命令從解釋器中刪除變量,它后面可以有任意多個參數(shù),每個參數(shù)是一個變量名,可以是簡單變量,也可以是數(shù)組或數(shù)組元素。例如: % unset a b day(monday) 上面的語句中刪除了變量a、b和數(shù)組元素day(mo

16、nday),但是數(shù)組day并沒有刪除,其他元素還存在,要刪除整個數(shù)組,只需給出數(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 variable append和incr這兩個命令提供了改變變量的值的簡單手段。 append命令把文本加到一個變量的后面,例如: % set txt hello hello % append

17、txt ! How are you hello! How are you incr命令把一個變量值加上一個整數(shù)。incr要求變量原來的值和新加的值都必須是整數(shù)。 %set b a a % incr b expected integer but got a %set b 2 2 %incr b 3 5 表達式 操作數(shù)TCL表達式的操作數(shù)通常是整數(shù)或實數(shù)。整數(shù)一般是十進制的, 但如果整數(shù)的第一個字符是0(zero),那么TCL將把這個整數(shù)看作八進制的,如果前兩個字符是0x則這個整數(shù)被看作是十六進制的。TCL的實數(shù)的寫法與ANSI C中完全一樣。如: 2.1 7.9e+12 6e4 3. 表達式 運

18、算符和優(yōu)先級下面的表格中列出了TCL中用到的運算符,它們的語法形式和用法跟ANSI C中很相似。這里就不一一介紹。下表中的運算符是按優(yōu)先級從高到低往下排列的。同一格中的運算符優(yōu)先級相同。 語法形式結果操作數(shù)類型-a!aa負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等

19、于不等于int,float,stringint,float,stringa&b位操作與intab位操作異或inta|b位操作或inta&b邏輯與int,floata|b邏輯或int,floata?b:c選擇運算a:int,float表達式 數(shù)學函數(shù)TCL支持常用的數(shù)學函數(shù),表達式中數(shù)學函數(shù)的寫法類似于CC+語言的寫法,數(shù)學函數(shù)的參數(shù)可以是任意表達式,多個參數(shù)之間用逗號隔開。例如: %set x 2 2 % expr 2* sin($x List命令list這個概念在TCL中是用來表示集合的。TCL中l(wèi)ist是由一堆元素組成的有序集合,list可以嵌套定義,list每個元素可以是任意字符串,也可

20、以是list。下面都是TCL中的合法的list: /空list a b c d a b c d /list可以嵌套 list是TCL中比較重要的一種數(shù)據(jù)結構,對于編寫復雜的腳本有很大的幫助,TCL提供了很多基本命令對list進行操作,下面一一介紹: list命令語法: list ? value value.? 這個命令生成一個list,list的元素就是所有的value。例: % list 1 2 3 4 1 2 3 4 List concat命令語法:concat list ?list.? 這個命令把多個list合成一個list,每個list變成新list的一個元素。 List lindex

21、命令語法:lindex list index 返回list的第index個(0-based)元素。例: % lindex 1 2 3 4 2 3 4 List llength命令語法:llength list 返回list的元素個數(shù)。例 % llength 1 2 3 4 3 List linsert命令語法:linsert list index value ?value.? 返回一個新串,新串是把所有的value參數(shù)值插入list的第index個(0-based)元素之前得到。例: % linsert 1 2 3 4 1 7 8 9 10 1 7 8 9 10 2 3 4 List lrep

22、lace命令語法:lreplace list first last ?value value .? 返回一個新串,新串是把list的第firs (0-based)t到第last 個(0-based)元素用所有的value參數(shù)替換得到的。如果沒有value參數(shù),就表示刪除第first到第last個元素。例: % lreplace 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命令語法:lrange list first last 返回list的第first (0

23、-based)到第last (0-based)元素組成的串,如果last的值是end。就是從第first個直到串的最后。 例: % lrange 1 7 8 2 4 5 6 3 end 2 4 5 6 List lappend命令語法:lappend varname value ?value.? 把每個value的值作為一個元素附加到變量varname后面,并返回變量的新值,如果varname不存在,就生成這個變量。例: % lappend a 1 2 3 1 2 3 % set a 1 2 3 List lsearch命令語法:lsearch ?-exact? ?-glob? ?-regex

24、p? list pattern 返回list中第一個匹配模式pattern的元素的索引,如果找不到匹配就返回-1。-exact、-glob、 -regexp是三種模式匹配的技術。-exact表示精確匹配;-glob的匹配方式和string match命令的匹配方式相同,將在后面第八節(jié)介紹string命令時介紹;-regexp表示正規(guī)表達式匹配,將在第八節(jié)介紹regexp命令時介紹。缺省時使用-glob匹配。例: % set a how are you how are you % lsearch $a y* 2 % lsearch $a y? -1 List lsort命令語法:lsort ?o

25、ptions? list 這個命令返回把list排序后的串。options可以是如下值: -ascii 按ASCII字符的順序排序比較.這是缺省情況。-dictionary 按字典排序,與-ascii不同的地方是: (1)不考慮大小寫 (2)如果元素中有數(shù)字的話,數(shù)字被當作整數(shù)來排序. 因此:bigBoy排在bigbang和bigboy之間, x10y 排在x9y和x11y之間. -integer 把list的元素轉換成整數(shù),按整數(shù)排序. -real 把list的元素轉換成浮點數(shù),按浮點數(shù)排序. -increasing 升序(按ASCII字符比較) -decreasing 降序(按ASCII字

26、符比較) -command command TCL自動利用command 命令把每兩個元素一一比較,然后給出排序結果。 List split命令語法:split string ?splitChars? 把字符串string按分隔符splitChars分成一個個單詞,返回由這些單詞組成的串。如果splitChars 是一個空字符,string被按字符分開。如果splitChars沒有給出,以空格為分隔符。例: % split how.are.you . how are you % split how are you how are you % split how are you h o w a

27、r e y o u List join命令語法:join list ?joinString? join命令是命令的逆。這個命令把list的所有元素合并到一個字符串中,中間以joinString分開。缺省的joinString是空格。例: % join h o w a r e y o u how are you % join how are you . how.are.you 控制流 if命令TCL中的控制流和C語言類似,包括if、while、for、foreach、switch、break、continue等命令。語法: if test1 body1 ?elseif test2 body2 e

28、lseif. ? ?else bodyn? TCL先把test1當作一個表達式求值,如果值非0,則把body1當作一個腳本執(zhí)行并返回所得值,否則把test2當作一個表達式求值,如果值非0,則把body2當作一個腳本執(zhí)行并返回所得值。例如: if $x0 . elseif $x1 . elseif $x2 . else . 注意,上例中一定要寫在上一行,因為如果不這樣,TCL 解釋器會認為if命令在換行符處已結束,下一行會被當成新的命令,從而導致錯誤的結果。在下面的循環(huán)命令的書寫中也要注意這個問題。書寫中還要注意的一個問題是if 和之間應該有一個空格,否則TCL解釋器會把if作為一個整體當作一個

29、命令名,從而導致錯誤。 控制流 循環(huán)命令循環(huán)命令包括while、for、foreach等。while命令語法為: while test body 參數(shù)test是一個表達式,body是一個腳本,如果表達式的值非0,就運行腳本,直到表達式為0才停止循環(huán),此時while命令中斷并返回一個空字符串。 例如: 假設變量 a 是一個鏈表,下面的腳本把a 的值復制到b: set b set i expr llength $a -1 while $i=0 lappend b lindex $a $i incr i -1 for命令語法為: for init test reinit body 參數(shù)init是一個

30、初始化腳本,第二個參數(shù)test是一個表達式,用來決定循環(huán)什么時候中斷,第三個參數(shù)reinit是一個重新初始化的腳本,第四個參數(shù)body也是腳本,代表循環(huán)體。下例與上例作用相同: set b for set i expr llength $a -1 $i=0 incr i -1 lappend b lindex $a $i foreach命令這個命令有兩種語法形式 1、 foreach varName list body 第一個參數(shù)varName是一個變量,第二個參數(shù)list 是一個表(有序集合),第三個參數(shù)body是循環(huán)體。每次取得鏈表的一個元素,都會執(zhí)行循環(huán)體一次。 下例與上例作用相同: s

31、et b foreach i $a set b linsert $b 0 $i 2、 foreach varlist1 list1 ?varlist2 list2 .? Body 這種形式包含了第一種形式。第一個參數(shù)varlist1是一個循環(huán)變量列表,第二個參數(shù)是一個列表list1,varlist1中的變量會分別取list1中的值。body參數(shù)是循環(huán)體。 ?varlist2 list2 .?表示可以有多個變量列表和列表對出現(xiàn)。例如: set x foreach i j a b c d e f lappend x $j $i 這時總共有三次循環(huán),x的值為b a d c f e。 set x fo

32、reach i a b c j d e f g lappend x $i $j 這時總共有四次循環(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 這時總共有三次循環(huán),x的值為a d e b f g c 。 break和continue命令在循環(huán)體中,可以用break和continue命令中斷循環(huán)。其中break命令結束整個循環(huán)過程,并從循環(huán)中跳出,continue只是結束本次循環(huán)。 switch 命令和C語言中switch語句一樣,TCL中的switch命令也可以由if命令實現(xiàn)。只是書寫起來較為煩

33、瑣。 switch命令的語法為: switch ? options? string pattern body ? pattern body .? 第一個是可選參數(shù)options,表示進行匹配的方式。TCL支持三種匹配方式:-exact方式,-glob方式,-regexp方式,缺省情況表示-glob方式。-exact方式表示的是精確匹配,-glob方式的匹配方式和string match 命令的匹配方式相同(第八節(jié)介紹),-regexp方式是正規(guī)表達式的匹配方式(第八節(jié)介紹)。第二個參數(shù)string 是要被用來作測試的值,第三個參數(shù)是括起來的一個或多個元素對,例: switch $x a - b

34、 incr t1 c incr t2 default incr t3 其中a的后面跟一個表示使用和下一個模式相同的腳本。default表示匹配任意值。一旦switch命令 找到一個模式匹配,就執(zhí)行相應的腳本,并返回腳本的值,作為switch命令的返回值。 控制流 eval命令eval命令是一個用來構造和執(zhí)行TCL腳本的命令,其語法為: eval arg ?arg .? 它可以接收一個或多個參數(shù),然后把所有的參數(shù)以空格隔開組合到一起成為一個腳本,然后對這個腳本進行求值。例如: eval set a 2 ;set b 4 4 控制流 source命令sosource命令讀一個文件并把這個文件的內容

35、作為一個腳本進行求值。例如: source e:/tcl&c/hello.tcl 注意路徑的描述應該和UNIX相同,使用/而不是。 過程(procedure) 過程定義和返回值TCL支持過程的定義和調用,在TCL中,過程可以看作是用TCL腳本實現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數(shù)。 TCL中過程是由proc命令產(chǎn)生的: 例如: % proc add x y expr $x+$y proc命令的第一個參數(shù)是你要定義的過程的名字,第二個參數(shù)是過程的參數(shù)列表,參數(shù)之間用空格隔開,第三個參數(shù)是一個TCL腳本,代表過程體。

36、 proc生成一個新的命令,可以象固有命令一樣調用: % add 1 2 3 在定義過程時,你可以利用return命令在任何地方返回你想要的值。 return命令迅速中斷過程,并把它的參數(shù)作為過程的結果。例如: % proc abs x if $x = 0 return $x return expr -$x 過程的返回值是過程體中最后執(zhí)行的那條命令的返回值。 過程(procedure) 局部變量和全局變量對于在過程中定義的變量,因為它們只能在過程中被訪問,并且當過程退出時會被自動刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用

37、域的交集為空:局部變量的作用域是它所在的過程的內部;全局變量的作用域則不包括所有過程的內部。這一點和C語言有很大的不同. 如果我們想在過程內部引用一個全局變量的值,可以使用global命令。例如: % set a 4 4 % proc sample x global a incr a return expr $a+$x % sample 3 8 %set a 5 全局變量a在過程中被訪問。在過程中對a的改變會直接反映到全局上。如果去掉語句global a,TCL會出錯,因為它不認識變量a。 過程(procedure) 缺省參數(shù)和可變個數(shù)參數(shù)TCL還提供三種特殊的參數(shù)形式: 首先,你可以定義一個

38、沒有參數(shù)的過程,例如: proc add expr 2+3 其次,可以定義具有缺省參數(shù)值的過程,我們可以為過程的部分或全部參數(shù)提供缺省值,如果調用過程時未提供那些參數(shù)的值,那么過程會自動使用缺省值賦給相應的參數(shù)。和CC+中具有缺省參數(shù)值的函數(shù)一樣,有缺省值的參數(shù)只能位于參數(shù)列表的后部,即在第一個具有缺省值的參數(shù)后面的所有參數(shù),都只能是具有缺省值的參數(shù)。 例如: proc add val1 val2 2 val3 3 expr $val1+$val2+$val3 則: add 1 /值為6 add 2 20 /值為25 add 4 5 6 /值為15 另外,TCL的過程定義還支持可變個數(shù)的參數(shù),

39、如果過程的最后一個參數(shù)是args, 那么就表示這個過程支持可變個數(shù)的參數(shù)調用。調用時,位于args以前的參數(shù)象普通參數(shù)一樣處理,但任何附加的參數(shù)都需要在過程體中作特殊處理,過程的局部變量args將會被設置為一個列表,其元素就是所有附加的變量。如果沒有附加的變量,args就設置成一個空串,下面是一個例子: proc add val1 args set sum $val1 foreach i $args incr sum $i return $sum 則: add 2 /值為2 add 2 3 4 5 6 /值為20 過程(procedure) 引用:upvar命令語法:upvar ?level?

40、 otherVar myVar ?otherVar myVar .? upvar命令使得用戶可以在過程中對全局變量或其他過程中的局部變量進行訪問。 upvar命令的第一個參數(shù)otherVar是我們希望以引用方式訪問的參數(shù)的名字,第二個參數(shù)myVar 是這個過程中的局部變量的名字,一旦使用了upvar 命令把otherVar 和myVar 綁定,那么在過程中對局部變量myVar 的讀寫就相當于對這個過程的調用者中otherVar 所代表的局部變量的讀寫。下面是一個例子: % proc temp arg upvar $arg b set b expr $b+2 % proc myexp var s

41、et a 4 temp a return expr $var+$a 則: % myexp 7 13 這個例子中,upvar 把$arg(實際上是過程myexp中的變量a)和過程temp中的變量b綁定,對b的讀寫就相當于對a的讀寫。 upvar命令語法中的level參數(shù)表示:調用upvar命令的過程相對于我們希望引用的變量myVar在調用棧中相對位置。例如: upvar 2 other x 這個命令使得當前過程的調用者的調用者中的變量other,可以在當前過程中利用x訪問。缺省情況下,level的值為1,即當前過程(上例中的temp)的調用者(上例中的myexp)中的變量(上例中myexp的a)

42、可以在當前過程中利用局部變量(上例中temp的b)訪問。 如果要訪問全局變量可以這樣寫: upvar 0 other x 那么,不管當前過程處于調用棧中的什么位置,都可以在當前過程中利用x訪問全局變量other。 字符串操作 format命令因為TCL把所有的輸入都當作字符串看待,所以TCL提供了較強的字符串操作功能,TCL中與字符串操作有關的命令有:string、format、regexp、regsub、scan等。 format命令語法:format formatstring ?vlue value.? format命令類似于ANSIC中的sprintf函數(shù)和MFC中CString類提供的

43、Format成員函數(shù)。它按formatstring提供的格式,把各個value的值組合到formatstring中形成一個新字符串,并返回。例如: %set name john John %set age 20 20 %set msg format %s is %d years old $name $age john is 20 years old 字符串操作 scan命令語法:scan string format varName ?varName .? scan命令可以認為是format命令的逆,其功能類似于ANSI C中的sscanf函數(shù)。它按format提供的格式分析string字符串,

44、然后把結果存到變量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 %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命令的返回值是匹配的變量個數(shù)。而且,我

45、們發(fā)現(xiàn),如果變量varName不存在的話,TCL會自動聲明該變量。 字符串操作 regexp命令語法:regexp ?switchs? ?-? exp string ?matchVar? ?subMatchVar subMatchVar.? regexp命令用于判斷正規(guī)表達式exp是否全部或部分匹配字符串string,匹配返回1,否則0。 在正規(guī)表達式中,一些字符具有特殊的含義,下表一一列出,并給予了解釋。 字符意義.匹配任意單個字符表示從頭進行匹配$表示從末尾進行匹配x匹配字符x,這可以抑制字符x的含義chars匹配字符集合chars中給出的任意字符,如果chars中的第一個字符是,表示匹配

46、任意不在chars中的字符,chars的表示方法支持a-z之類的表示。(regexp)把regexp作為一個單項進行匹配*對*前面的項進行0次或多次匹配+對前面的項進行1次或多次匹配?對?前面的項進行0次或1次匹配regexp1|regexp2匹配regexp1或regexp2中的一項下面的一個例子是從Tcl and Tk ToolKit中摘下來的,下面進行說明: (0x)?0-9a-fA-F+|0-9+)$ 這個正規(guī)表達式匹配任何十六進制或十進制的整數(shù)。 兩個正規(guī)表達式以|分開(0x)?0-9a-fA-F+和0-9+,表示可以匹配其中的任何一個,事實上前者匹配十六進制,后者匹配的十進制。 表

47、示必須從頭進行匹配,從而上述正規(guī)表達式不匹配jk12之類不是以0x或數(shù)字開頭的串。 表示必須從末尾開始匹配,從而上述正規(guī)表達式不匹配12jk之類不是數(shù)字或a-fA-F結尾的串。 下面以(0x)?0-9a-fA-F+ 進行說明,(0x)表示0x一起作為一項,?表示前一項(0x)可以出現(xiàn)0次或多次,0-9a-fA-F表示可以是任意0到9之間的單個數(shù)字或a到f或A到F之間的單個字母,表示象前面那樣的單個數(shù)字或字母可以重復出現(xiàn)一次或多次。 % regexp (0x)?0-9a-fA-F+|0-9+)$ ab 1 % regexp (0x)?0-9a-fA-F+|0-9+)$ 0xabcd 1 % regexp (0x)?0-9a-fA-F+|0-9+)$ 12345 1 % regexp (0x)?0-9a-fA-F+|0-9+)$ 123j 0 如果regexp命令后面有參數(shù)matchVar和subMatchVar,則所有的參數(shù)被當作變量名,如果變量不存在,就會被生成。 regexp把匹配整個正規(guī)表達式的子字符串賦給第一個

溫馨提示

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

評論

0/150

提交評論