




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Tcl教程TCL語法腳本、命令和單詞符號.2置換(substitution) .2注釋.5變量簡單變量.5數組.6相關命令.6表達式操作數.7運算符和優先級.7數學函數8Listlist命令.10concat命令10lindex命令.11llength命令.11linsert命令.11lreplace命令.11lrange 命令11lappend命令.12lsearch 命令.12lsort命令.13split命令.13join命令.13控制流if命令.13循環命令:while 、for、 foreach.14eval命令.15source命令.16過程(procedure)過程定義和返回值1
2、6局部變量和全局變量.17缺省參數和可變個數參數.17引用:upvar.18字符串操作format命令.19scan命令.20regexp命令regsub命令string命令文件訪問文件名基本文件輸入輸出命令隨機文件訪問當前工作目錄文件操作和獲取文件信息錯誤和異常錯誤從TCL腳本中產生錯誤使用catch捕獲錯誤其他異常深入TCL查詢數組中的元素info命令TCL語法 > 腳本、命令和單詞符號一個TCL腳本可以包含一個或多個命令。命令之間必須用換行符或分號隔開,下面的兩個腳本都是合法的: set a 1 set b 2 或 set a 1;set b 2 TCL的每一個命令包含一個或幾個單
3、詞,第一個單詞代表命令名,另外的單詞則是這個命令的參數,單詞之間必須用空格或TAB鍵隔開。 TCL解釋器對一個命令的求值過程分為兩部分:分析和執行。在分析階段,TCL 解釋器運用規則把命令分成一個個獨立的單詞,同時進行必要的置換(substitution); 在執行階段,TCL 解釋器會把第一個單詞當作命令名,并查看這個命令是否有定義,如果有定義就激活這個命令對應的C/C+過程,并把所有的單詞作為參數傳遞給該命令過程,讓命令過程進行處理。 TCL語法 > 置換(substitution)注:在下面的所有章節的例子中,''為TCL的命令提示符,輸入命令回車后,TCL會在接著
4、的一行輸出命令執行結果。'/'后面是我自己加上的說明,不是例子的一部分。 TCL解釋器在分析命令時,把所有的命令參數都當作字符串看待,例如: %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提供三種形式的置換:變量置換、命令置換和
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)命令
6、置換是由括起來的TCL命令及其參數,命令置換會導致某一個命令的所有或部分單詞被另一個命令的結果所代替。例如: %set y expr $x+100 110 y的值是110,這里當TCL解釋器遇到字符''時,它就會把隨后的expr作為一個命令名,從而激活與expr對應的C/C+過程,并把'expr'和變量置換后得到的'10+110'傳遞給該命令過程進行處理。 如果在上例中我們去掉,那么TCL會報錯。因為在正常情況下,TCL解釋器只把命令行中的第一個單詞作為看作命令,其他的單詞都作為普通字符串處理,看作是命令的參數。 注意,中必須是一個合法的TCL腳
7、本,長度不限。中腳本的值為最后一個命令的返回值,例如: %set y expr $x+100;set b 300 /y的值為300,因為set b 300的返回值為300 300 有了命令置換,實際上就表示命令之間是可以嵌套的,即一個命令的結果可以作為別的命令的參數。 反斜杠置換(backslash substitution)TCL語言中的反斜杠置換類似于C語言中反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、$等被TCL解釋器當作特殊符號對待的字符。例如: set msg multiple space /msg的值為multiple space。 如果沒有''的話,T
8、CL會報錯,因為解釋器會把這里最后兩個單詞之間的空格認為是分隔符,于是發現set命令有多于兩個參數,從而報錯。加入了''后,空格不被當作分隔符,'multiple space'被認為是一個單詞(word)。又例如: %set msg money $3333 nArray a2 /這個命令的執行結果為:money $3333 Array a2 這里的$不再被當作變量置換符。 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 /對應 xhh H /十六進制的48正好是72,對應H set a 110 /對應 ddd H /八進制的110正
10、好是72,對應H set a expr / 對應newline space,一個命令可以用newline轉到下一行繼續 2+3 5 雙引號和花括號 除了使用反斜杠外,TCL提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當作普通字符,而不作特殊處理,這就要使用雙引號和花括號()。 TCL解釋器對雙引號中的各種分隔符將不作處理,但是對換行符 及和兩種置換符會照常處理。例如: %set x 100 100 %set y "$x ddd" 100 ddd 而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會對其作特殊處理。 %set y /n$x e
11、xpr 10+100 /n$x expr 10+100 TCL語言教程 > TCL語法 > 注釋TCL中的注釋符是'',''和直到所在行結尾的所有字符都被TCL看作注釋,TCL解釋器對注釋將不作任何處理。不過,要注意的是,''必須出現在TCL解釋器期望命令的第一個字符出現的地方,才被當作注釋。 例如: %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 第二行中''就不被當作注釋符,因為它出現在命令的中間,TCL解釋器把它和后面的字符當作命令的參數處理,從而導致錯誤。而第四行的''就被作為注釋,因為前一個命令已經用一個分號結束,TCL解釋器期望下一個命令接著出現。現在在這個位置出現'#',隨后的字符就被當作注釋了。 變量 > 簡單變量一個TCL的簡單變量包含兩個部分:名字和值。名字和值都可以是任意字符串。例如一個名為 “1323 7&*: hdgg"的變量在TCL中都是合法的。不過為了更好的使用置換(substitution
13、),變量名最好按CC+語言中標識符的命名規則命名。 TCL解釋器在分析一個變量置換時,只把從符號往后直到第一個不是字母、數字或下劃線的字符之間的單詞符號作為要被置換的變量的名字。例如: % set a 2 2 set a.1 4 4 % set b $a.1 2.1 在最后一個命令行,我們希望把變量a.1的值付給b,但是TCL解釋器在分析時只把$符號之后直到第一個不是字母、數字或下劃線的字符(這里是'.')之間的單詞符號(這里是'a')當作要被置換的變量的名字,所以TCL解釋器把a置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。 當然,如果變
14、量名中有不是字母、數字或下劃線的字符,又要用置換,可以用花括號把變量名括起來。例如: %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 這個只有一個參數的set命令讀取a的當前值kdfj kjdf。 變量 > 數組數組是一些元素的集合。TCL的數組和普通計算機語言中的數組有很大的區別。在TCL中,不能單獨聲明一個數組,數組只能
15、和數組元素一起聲明。數組中,數組元素的名字包含兩部分:數組名和數組中元素的名字,TCL中數組元素的名字(下標可以為任何字符串。例如: set day(monday) 1 set day(tuesday) 2 第一個命令生成一個名為day的數組,同時在數組中生成一個名為monday的數組元素,并把值置為1,第二個命令生成一個名為tuesday的數組元素,并把值置為2。 簡單變量的置換已經在前一節討論過,這里講一下數組元素的置換。除了有括號之外,數組元素的置換和簡單變量類似。例: 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不能支持復雜的數據類型,這是一個很大的缺憾,也是TCL受指責很多的方面。但是TCL的一個擴展ITCL填補了這個缺憾變量 > 相關命令set這個命令在3.1已有詳細介紹。 unset這個命令從解釋器中刪除變量,它后面可以有任意多個參數,每個參數是一個變量名,可以是簡單變量,也可以是數組或數組元素。例如: % unset a b day(monday) 上面的語句中刪除了變量a、b和數組元素day(monday),但是數組day并沒有刪除,其他元素還存在,要刪除整個數組,只需給出數組
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這兩個命令提供了改變變量的值的簡單手段。 append命令把文本加到一個變量的后面,例如: % set txt hello hello % append txt &qu
18、ot;! How are you" hello! How are you incr命令把一個變量值加上一個整數。incr要求變量原來的值和新加的值都必須是整數。 %set b a a % incr b expected integer but got "a" %set b 2 2 %incr b 3 5 表達式 > 操作數TCL表達式的操作數通常是整數或實數。整數一般是十進制的, 但如果整數的第一個字符是0(zero),那么TCL將把這個整數看作八進制的,如果前兩個字符是0x則這個整數被看作是十六進制的。TCL的實數的寫法與ANSI C中完全一樣。如: 2.
19、1 7.9e+12 6e4 3. 表達式 > 運算符和優先級下面的表格中列出了TCL中用到的運算符,它們的語法形式和用法跟ANSI C中很相似。這里就不一一介紹。下表中的運算符是按優先級從高到低往下排列的。同一格中的運算符優先級相同。 語法形式結果操作數類型-a!aa負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選擇運算a:int,float表達式 > 數學函數TCL支持常用的數學函數,表達式中數學函數的寫法類似于CC+語言的寫法,數學函數的參數可以是任意表達式,多個參數之間用逗號隔開。例如: %set x 2 2 % expr 2* sin
21、($x<3) 1.68294196962 其中expr是TCL的一個命令,語法為: expr arg ?arg .? 兩個 ?之間的參數表示可省,后面介紹命令時對于可省參數都使用這種表示形式。 expr可以有一個或多個參數,它把所有的參數組合到一起,作為一個表達式,然后求值: %expr 12*3 7 %expr 1 +2 *3 7 需要注意的一點是,數學函數并不是命令,只在表達式中出現才有意義。 TCL中支持的數學函數如下 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中有很多命令都以表達式作為參數。最典型的是expr命令,另外if、while、for等循
25、環控制命令的循環控制中也都使用表達式作為參數。 List > List命令list這個概念在TCL中是用來表示集合的。TCL中list是由一堆元素組成的有序集合,list可以嵌套定義,list每個元素可以是任意字符串,也可以是list。下面都是TCL中的合法的list: /空list a b c d a b c d /list可以嵌套 list是TCL中比較重要的一種數據結構,對于編寫復雜的腳本有很大的幫助,TCL提供了很多基本命令對list進行操作,下面一一介紹: list命令語法: list ? value value.? 這個命令生成一個list,list的元素就是所有的value
26、。例: % list 1 2 3 4 1 2 3 4 List > concat命令語法:concat list ?list.? 這個命令把多個list合成一個list,每個list變成新list的一個元素。 List > lindex命令語法:lindex list index 返回list的第index個(0-based)元素。例: % lindex 1 2 3 4 2 3 4 List > llength命令語法:llength list 返回list的元素個數。例 % llength 1 2 3 4 3 List > linsert命令語法:linsert li
27、st index value ?value.? 返回一個新串,新串是把所有的value參數值插入list的第index個(0-based)元素之前得到。例: % linsert 1 2 3 4 1 7 8 9 10 1 7 8 9 10 2 3 4 List > lreplace命令語法:lreplace list first last ?value value .? 返回一個新串,新串是把list的第firs (0-based)t到第last 個(0-based)元素用所有的value參數替換得到的。如果沒有value參數,就表示刪除第first到第last個元素。例: % 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命令語法:lrange list first last 返回list的第first (0-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.? 把每
29、個value的值作為一個元素附加到變量varname后面,并返回變量的新值,如果varname不存在,就生成這個變量。例: % lappend a 1 2 3 1 2 3 % set a 1 2 3 List > lsearch命令語法:lsearch ?-exact? ?-glob? ?-regexp? list pattern 返回list中第一個匹配模式pattern的元素的索引,如果找不到匹配就返回-1。-exact、-glob、 -regexp是三種模式匹配的技術。-exact表示精確匹配;-glob的匹配方式和string match命令的匹配方式相同,將在后面第八節介紹st
30、ring命令時介紹;-regexp表示正規表達式匹配,將在第八節介紹regexp命令時介紹。缺省時使用-glob匹配。例: % set a how are you how are you % lsearch $a y* 2 % lsearch $a y? -1 List > lsort命令語法:lsort ?options? list 這個命令返回把list排序后的串。options可以是如下值: -ascii 按ASCII字符的順序排序比較.這是缺省情況。-dictionary 按字典排序,與-ascii不同的地方是: (1)不考慮大小寫 (2)如果元素中有數字的話,數字被當作整數來排
31、序. 因此:bigBoy排在bigbang和bigboy之間, x10y 排在x9y和x11y之間. -integer 把list的元素轉換成整數,按整數排序. -real 把list的元素轉換成浮點數,按浮點數排序. -increasing 升序(按ASCII字符比較) -decreasing 降序(按ASCII字符比較) -command command TCL自動利用command 命令把每兩個元素一一比較,然后給出排序結果。 List > split命令語法:split string ?splitChars? 把字符串string按分隔符splitChars分成一個個單詞,返回由
32、這些單詞組成的串。如果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 r e y o u List > join命令語法:join list ?joinString? join命令是命令的逆。這個命令把list的所有元素合并到一個字符串中,中間以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語言類似,包括if、while、for、foreach、switch、break、continue等命令。語法: if test1 body1 ?elseif test2 body2 elseif. ? ?else bodyn? TCL先把test1當作一個表達式求值,如果值非0,則把body1當作一個腳本執行并返回所得值,否則把test2當作一個表達式求值,如果
34、值非0,則把body2當作一個腳本執行并返回所得值。例如: if $x>0 . elseif $x1 . elseif $x2 . else . 注意,上例中''一定要寫在上一行,因為如果不這樣,TCL 解釋器會認為if命令在換行符處已結束,下一行會被當成新的命令,從而導致錯誤的結果。在下面的循環命令的書寫中也要注意這個問題。書寫中還要注意的一個問題是if 和之間應該有一個空格,否則TCL解釋器會把'if'作為一個整體當作一個命令名,從而導致錯誤。 控制流 > 循環命令循環命令包括while、for、foreach等。while命令語法為: whil
35、e test body 參數test是一個表達式,body是一個腳本,如果表達式的值非0,就運行腳本,直到表達式為0才停止循環,此時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 參數init是一個初始化腳本,第二個參數test是一個表達式,用來決定循環什么時候中斷,第三個參數rei
36、nit是一個重新初始化的腳本,第四個參數body也是腳本,代表循環體。下例與上例作用相同: 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 第一個參數varName是一個變量,第二個參數list 是一個表(有序集合),第三個參數body是循環體。每次取得鏈表的一個元素,都會執行循環體一次。 下例與上例作用相同: set b " " foreac
37、h i $a set b linsert $b 0 $i 2、 foreach varlist1 list1 ?varlist2 list2 .? Body 這種形式包含了第一種形式。第一個參數varlist1是一個循環變量列表,第二個參數是一個列表list1,varlist1中的變量會分別取list1中的值。body參數是循環體。 ?varlist2 list2 .?表示可以有多個變量列表和列表對出現。例如: set x foreach i j a b c d e f lappend x $j $i 這時總共有三次循環,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 這時總共有四次循環,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 這時總共有三次循環,x的值為"a d e b f g c "。 break和continue命令在循環體中,可以用break和continue命令中斷循環。其中break命令結束整個循環過程,并從循環中跳出,continue只是結束本次循環。 switch 命令和C語言中switch語句一樣,TCL中的swi
39、tch命令也可以由if命令實現。只是書寫起來較為煩瑣。 switch命令的語法為: switch ? options? string pattern body ? pattern body .? 第一個是可選參數options,表示進行匹配的方式。TCL支持三種匹配方式:-exact方式,-glob方式,-regexp方式,缺省情況表示-glob方式。-exact方式表示的是精確匹配,-glob方式的匹配方式和string match 命令的匹配方式相同(第八節介紹),-regexp方式是正規表達式的匹配方式(第八節介紹)。第二個參數string 是要被用來作測試的值,第三個參數是括起來的一個
40、或多個元素對,例: switch $x a - b incr t1 c incr t2 default incr t3 其中a的后面跟一個''表示使用和下一個模式相同的腳本。default表示匹配任意值。一旦switch命令 找到一個模式匹配,就執行相應的腳本,并返回腳本的值,作為switch命令的返回值。 控制流 > eval命令eval命令是一個用來構造和執行TCL腳本的命令,其語法為: eval arg ?arg .? 它可以接收一個或多個參數,然后把所有的參數以空格隔開組合到一起成為一個腳本,然后對這個腳本進行求值。例如: eval set a 2 ;set b
41、4 4 控制流 > source命令sosource命令讀一個文件并把這個文件的內容作為一個腳本進行求值。例如: source e:/tcl&c/hello.tcl 注意路徑的描述應該和UNIX相同,使用'/'而不是''。 過程(procedure) > 過程定義和返回值TCL支持過程的定義和調用,在TCL中,過程可以看作是用TCL腳本實現的命令,效果與TCL的固有命令相似。我們可以在任何時候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數。 TCL中過程是由proc命令產生的: 例如: % proc add x y expr
42、$x+$y proc命令的第一個參數是你要定義的過程的名字,第二個參數是過程的參數列表,參數之間用空格隔開,第三個參數是一個TCL腳本,代表過程體。 proc生成一個新的命令,可以象固有命令一樣調用: % add 1 2 3 在定義過程時,你可以利用return命令在任何地方返回你想要的值。 return命令迅速中斷過程,并把它的參數作為過程的結果。例如: % proc abs x if $x >= 0 return $x return expr -$x 過程的返回值是過程體中最后執行的那條命令的返回值。 過程(procedure) > 局部變量和全局變量對于在過程中定義的變量,因
43、為它們只能在過程中被訪問,并且當過程退出時會被自動刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內部;全局變量的作用域則不包括所有過程的內部。這一點和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的改變會直接反映到全局上。如果
44、去掉語句global a,TCL會出錯,因為它不認識變量a。 過程(procedure) > 缺省參數和可變個數參數TCL還提供三種特殊的參數形式: 首先,你可以定義一個沒有參數的過程,例如: proc add expr 2+3 其次,可以定義具有缺省參數值的過程,我們可以為過程的部分或全部參數提供缺省值,如果調用過程時未提供那些參數的值,那么過程會自動使用缺省值賦給相應的參數。和CC+中具有缺省參數值的函數一樣,有缺省值的參數只能位于參數列表的后部,即在第一個具有缺省值的參數后面的所有參數,都只能是具有缺省值的參數。 例如: 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的過程定義還支持可變個數的參數,如果過程的最后一個參數是args, 那么就表示這個過程支持可變個數的參數調用。調用時,位于args以前的參數象普通參數一樣處理,但任何附加的參數都需要在過程體中作特殊處理,過程的局部變量args將會被設置為一個列表,其元素就是所有附加的變量。如果沒有附加的變量,args就設置成一個空串,下面是一個例子: 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 過程(procedure) > 引用:upvar命令語法:upvar ?level? otherVar myVar ?otherVar myVar .? upvar命令使得用戶可以在過程中對全局變量或其他過程中的局部變量進行訪問。 upvar命令的第一個參數otherVar是我們希望以引用方式訪問的參數的名字,第二個參數myVar 是這個過程中的局部變量的名字,一旦使用了upvar 命令把otherVar 和myVar 綁定,那么在過程中對局部變量myVar 的讀寫就相當于對這個過程的調用者中
47、otherVar 所代表的局部變量的讀寫。下面是一個例子: % 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 這個例子中,upvar 把$arg(實際上是過程myexp中的變量a)和過程temp中的變量b綁定,對b的讀寫就相當于對a的讀寫。 upvar命令語法中的level參數表示:調用upvar命令的過程相對于我們希望引用的變量myVar在調用棧中相對位置。例如: upvar 2 other x 這個命令使得當前過程的
48、調用者的調用者中的變量other,可以在當前過程中利用x訪問。缺省情況下,level的值為1,即當前過程(上例中的temp)的調用者(上例中的myexp)中的變量(上例中myexp的a)可以在當前過程中利用局部變量(上例中temp的b)訪問。 如果要訪問全局變量可以這樣寫: upvar 0 other x 那么,不管當前過程處于調用棧中的什么位置,都可以在當前過程中利用x訪問全局變量other。 字符串操作 > format命令因為TCL把所有的輸入都當作字符串看待,所以TCL提供了較強的字符串操作功能,TCL中與字符串操作有關的命令有:string、format、regexp、regs
49、ub、scan等。 format命令語法:format formatstring ?vlue value.? format命令類似于ANSIC中的sprintf函數和MFC中CString類提供的Format成員函數。它按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 字符串操作 > sca
50、n命令語法:scan string format varName ?varName .? scan命令可以認為是format命令的逆,其功能類似于ANSI C中的sscanf函數。它按format提供的格式分析string字符串,然后把結果存到變量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命令的返回值是匹配的變量個數。而且,我們發現,如果變量varName不存在的話,TCL會自動聲明該變量。 字符串操作 > regexp命令語法:regexp ?switchs? ?-? exp string ?matchVar? ?subMatchVar sub
52、MatchVar.? regexp命令用于判斷正規表達式exp是否全部或部分匹配字符串string,匹配返回1,否則0。 在正規表達式中,一些字符具有特殊的含義,下表一一列出,并給予了解釋。 字符意義.匹配任意單個字符表示從頭進行匹配$表示從末尾進行匹配x匹配字符x,這可以抑制字符x的含義chars匹配字符集合chars中給出的任意字符,如果chars中的第一個字符是,表示匹配任意不在chars中的字符,chars的表示方法支持a-z之類的表示。(regexp)把regexp作為一個單項進行匹配*對*前面的項進行0次或多次匹配+對前面的項進行1次或多次匹配?對?前面的項進行0次或1次匹配reg
53、exp1|regexp2匹配regexp1或regexp2中的一項下面的一個例子是從Tcl and Tk ToolKit中摘下來的,下面進行說明: (0x)?0-9a-fA-F+|0-9+)$ 這個正規表達式匹配任何十六進制或十進制的整數。 兩個正規表達式以|分開(0x)?0-9a-fA-F+和0-9+,表示可以匹配其中的任何一個,事實上前者匹配十六進制,后者匹配的十進制。 表示必須從頭進行匹配,從而上述正規表達式不匹配jk12之類不是以0x或數字開頭的串。 表示必須從末尾開始匹配,從而上述正規表達式不匹配12jk之類不是數字或a-fA-F結尾的串。 下面以(0x)?0-9a-fA-F+ 進行說明,(0x)表示
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中建施工方案流程詳解
- 項目管理中的可持續發展理念實踐試題及答案
- 2025年注冊會計師備考時間分配試題及答案
- 財務報表披露中的常見合規問題試題及答案
- 2024項目管理資格的考試重點與趨勢分析試題及答案
- 2024年項目管理復習策略試題及答案
- 礦區塑膠跑道施工方案
- 證券從業資格證考試監測試題及答案
- 2024項目管理考試復習試題及答案
- 2025年注會備考的自我監督與激勵機制試題及答案
- 2020-2025年中國遼寧省風力發電行業發展潛力分析及投資方向研究報告
- GB 15269-2025雪茄煙
- 規模養殖場十項管理制度
- 2025航天知識競賽考試題庫(含答案)
- 2025中考英語熱點話題閱讀《哪吒2魔童鬧海》
- 勞務派遣勞務外包項目方案投標文件(技術方案)
- 瘧疾2025培訓課件
- 流行性感冒診療方案(2025版)解讀課件
- 雙溪村移民安置區環境綜合整治工程 施工圖設計說明
- 2025年度打印機銷售與升級改造合同模板4篇
- 2025年國家電投所屬國核鈾業招聘筆試參考題庫含答案解析
評論
0/150
提交評論