華為TCL培訓(xùn)教程(全)_第1頁
華為TCL培訓(xùn)教程(全)_第2頁
華為TCL培訓(xùn)教程(全)_第3頁
華為TCL培訓(xùn)教程(全)_第4頁
華為TCL培訓(xùn)教程(全)_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)TCL培訓(xùn)教程(全)(內(nèi)部使用)深圳市華為技術(shù)有限公司目 錄 TOC o 1-3 h z u TCL培訓(xùn)教程(全)關(guān)鍵詞:TCL 摘 要:本文是TCL教材的第三稿,前兩稿分別是TCL的使用和TCL培訓(xùn)教程。這一稿加入了不少內(nèi)容,是北研TCL興趣小組共同努力的結(jié)果。本文詳細介紹了TCL的各個方面,特別對利用CC+語言擴展TCL命令作了詳細論述。本文附有大量實例。縮略語清單: TCL Tool Command Language 一種腳本語言參考資料清單: 請在表格中羅列本文

2、檔所引用的有關(guān)參考文獻名稱、作者、標題、編號、發(fā)布日期和出版單位等基本信息。參考資料清單名稱作者編號發(fā)布日期查閱地點或渠道出版單位(若不為本公司發(fā)布的文獻,請?zhí)顚懘肆校㏕cl and Tk ToolKitJohn K.Ousterhout98123595161999自己的圖書Addison Wesley Publishing CommpanyTCL的使用陳旭盛自寫文檔TCL培訓(xùn)教程陳旭盛自寫文檔引言TCL(Tool Command Language)是一種解釋執(zhí)行的腳本語言(Scripting Language)。 它提供了通用的編程能力:支持變量、過程和控制結(jié)構(gòu);同時TCL還擁有一個功能強大

3、的固有的核心命令集。由于TCL的解釋器是用一個CC+語言的過程庫實現(xiàn)的,因此在某種意義上我們又可以把TCL看作一個C庫,這個庫中有豐富的用于擴展TCL命令的CC+過程和函數(shù),可以很容易就在CC+應(yīng)用程序中嵌入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ù)需要,我們

4、甚至可以屏蔽掉TCL的某些固有命令和固有控制結(jié)構(gòu)。通過對TCL的擴展、繼承或屏蔽,用戶用不著象平時定義一種計算機語言那樣對詞法、語法、語義、語用等各方面加以定義,就可以方便的為自己的應(yīng)用領(lǐng)域提供一種功能完備的腳本語言。TCL良好的可擴展性使得它能很好地適應(yīng)產(chǎn)品測試的需要,測試任務(wù)常常會由于設(shè)計和需求的改變而迅速改變,往往讓測試人員疲于應(yīng)付。利用TCL的可擴展性,測試人員就可以迅速繼承多種新技術(shù),并針對產(chǎn)品新特點迅速推出擴展TCL命令集,以用于產(chǎn)品的測試中,可以較容易跟上設(shè)計需求的變化。另外,因為TCL是一種比CC+ 語言有著更高抽象層次的語言,使用TCL可以在一種更高的層次上編寫程序,它屏蔽掉

5、了編寫CC+程序時必須涉及到的一些較為煩瑣的細節(jié),可以大大地提高開發(fā)測試例的速度。而且, 使用TCL語言寫的測試例腳本,即使作了修改,也用不著重新編譯就可以調(diào)用TCL解釋器直接執(zhí)行。可以省卻不少時間。TCL 目前已成為自動測試中事實上的標準。語法簡單的講,TCL語言的語法實際上是一些TCL解釋器怎樣對TCL命令進行分析的規(guī)則的集合。腳本、命令和單詞符號一個TCL腳本可以包含一個或多個命令。命令之間必須用換行符或分號隔開,下面的兩個腳本都是合法的:set a 1set b 2或set a 1;set b 2TCL的每一個命令包含一個或幾個單詞,第一個單詞代表命令名,另外的單詞則是這個命令的參數(shù),

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

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

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

9、遇到字符時,它就會把隨后的expr作為一個命令名,從而激活與expr對應(yīng)的C/C+過程,并把expr和變量置換后得到的10+110傳遞給該命令過程進行處理。如果在上例中我們?nèi)サ?,那么TCL會報錯。因為在正常情況下,TCL解釋器只把命令行中的第一個單詞作為看作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。 注意,中必須是一個合法的TCL腳本,長度不限。中腳本的值為最后一個命令的返回值,例如:%set y expr $x+100;set b 300 /y的值為300,因為set b 300的返回值為300300有了命令置換,實際上就表示命令之間是可以嵌套的,即一個命令的結(jié)果可以作為別的命

10、令的參數(shù)。反斜杠置換(backslash substitution)TCL語言中的反斜杠置換類似于C語言中反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、$等被TCL解釋器當(dāng)作特殊符號對待的字符。例如:set msg multiple space /msg的值為multiple space。如果沒有的話,TCL會報錯,因為解釋器會把這里最后兩個單詞之間的空格認為是分隔符,于是發(fā)現(xiàn)set命令有多于兩個參數(shù),從而報錯。加入了后,空格不被當(dāng)作分隔符,multiple space被認為是一個單詞(word)。又例如: %set msg money $3333 nArray a2 /這個命令的執(zhí)

11、行結(jié)果為:money $3333 Array a2這里的$不再被當(dāng)作變量置換符。TCL支持以下的反斜杠置換:Backslash Sequence Replaced Bya Audible alert (0 x7)b Backspace (0 x8)f Form feed (0 xc)n Newline (0 xa)r Carriage return (0 xd)t Tab (0 x9)v Vertical tab (0 xb)ddd Octal value given by ddd(one, two, or three ds)xhh Hex value given by hh(any numb

12、er of hs) newline space A single space character.例如: set a x48 /對應(yīng) xhhH /十六進制的48正好是72,對應(yīng)H set a 110 /對應(yīng) dddH /八進制的110正好是72,對應(yīng)Hset a expr / 對應(yīng)newline space,一個命令可以用newline轉(zhuǎn)到下一行繼續(xù) 2+35雙引號和花括號 除了使用反斜杠外,TCL提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號和花括號()。TCL解釋器對雙引號中的各種分隔符將不作處理,但是對換行符 及和兩種置換符會照常處理

13、。例如:%set x 100100%set y $x ddd 100 ddd而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會對其作特殊處理。%set y /n$x expr 10+100 /n$x expr 10+100 注釋TCL中的注釋符是,和直到所在行結(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對注釋將不作任何處理。不過,要注意的是,必須出現(xiàn)在TCL解釋器期望命令的第一個字符出現(xiàn)的地方,才被當(dāng)作注釋。例如:%This is a comment%set a 100 # Not a commentwrong # args: should be set varNa

14、me ?newValue?%set b 101 ; # this is a comment101第二行中就不被當(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的簡單變量包含兩個部分:名字和值。名字和值都可以是任意字符串。例如一個名為 “1323 7&*: hdgg的變量在TCL中都是合法的。不過為了更好的使用置換(substitution)

15、,變量名最好按CC+語言中標識符的命名規(guī)則命名。 TCL解釋器在分析一個變量置換時,只把從符號往后直到第一個不是字母、數(shù)字或下劃線的字符之間的單詞符號作為要被置換的變量的名字。例如:% set a 22set a.1 44% set b $a.12.1在最后一個命令行,我們希望把變量a.1的值付給b,但是TCL解釋器在分析時只把$符號之后直到第一個不是字母、數(shù)字或下劃線的字符(這里是.)之間的單詞符號(這里是a)當(dāng)作要被置換的變量的名字,所以TCL解釋器把a置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。當(dāng)然,如果變量名中有不是字母、數(shù)字或下劃線的字符,又要用置換,可以用花

16、括號把變量名括起來。例如:%set b $a.14TCL中的set命令能生成一個變量、也能讀取或改變一個變量的值。例如: set a kdfj kjdfkdfj kjdf如果變量a還沒有定義,這個命令將生成 變量a,并將其值置為kdfj kjdf,若a已定義,就簡單的把a的值置為kdfj kjdf。set akdfj kjdf 這個只有一個參數(shù)的set命令讀取a的當(dāng)前值kdfj kjdf。 數(shù)組 數(shù)組是一些元素的集合。TCL的數(shù)組和普通計算機語言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨聲明一個數(shù)組,數(shù)組只能和數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組名和數(shù)組中元素的名字,TCL

17、中數(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 mondayset day(monday) 1set b $day(monday) /b的值為1,即day(monday)的值。set c $day($a) /c的值為1,即day(monda

18、y)的值。TCL不能支持復(fù)雜的數(shù)據(jù)類型,這是一個很大的缺憾,也是TCL受指責(zé)很多的方面。但是TCL的一個擴展ITCL填補了這個缺憾。相關(guān)命令set這個命令在3.1已有詳細介紹。unset 這個命令從解釋器中刪除變量,它后面可以有任意多個參數(shù),每個參數(shù)是一個變量名,可以是簡單變量,也可以是數(shù)組或數(shù)組元素。例如:% unset a b day(monday)上面的語句中刪除了變量a、b和數(shù)組元素day(monday),但是數(shù)組day并沒有刪除,其他元素還存在,要刪除整個數(shù)組,只需給出數(shù)組的名字。例如:%puts $day(monday)cant read day(monday): no such

19、element in array% puts $day(tuesday)2%unset day% puts $day(tuesday)cant read day(tuesday): no such variableappend和incr這兩個命令提供了改變變量的值的簡單手段。append命令把文本加到一個變量的后面,例如:% set txt hellohello% append txt ! How are youhello! How are youincr命令把一個變量值加上一個整數(shù)。incr要求變量原來的值和新加的值都必須是整數(shù)。%set b aa% incr bexpected integ

20、er but got a%set b 22%incr b 35表達式TCL中的表達式類似于ANSI C的表達式。表達式由操作數(shù)和操作符構(gòu)成,下面分別介紹。操作數(shù)TCL表達式的操作數(shù)通常是整數(shù)或?qū)崝?shù)。整數(shù)一般是十進制的, 但如果整數(shù)的第一個字符是0(zero),那么TCL將把這個整數(shù)看作八進制的,如果前兩個字符是0 x則這個整數(shù)被看作是十六進制的。TCL的實數(shù)的寫法與ANSI C中完全一樣。如:2.17.9e+126e43. 運算符和優(yōu)先級 下面的表格中列出了TCL中用到的運算符,它們的語法形式和用法跟ANSI C中很相似。這里就不一一介紹。下表中的運算符是按優(yōu)先級從高到低往下排列的。同一格中的

21、運算符優(yōu)先級相同。語法形式結(jié)果操作數(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等于不等于int,float,stringint,float,stringa&b位操作與intab位操作異或inta|b位操作或inta&b邏輯與int,floata|b邏

22、輯或int,floata?b:c選擇運算a:int,float 數(shù)學(xué)函數(shù)TCL支持常用的數(shù)學(xué)函數(shù),表達式中數(shù)學(xué)函數(shù)的寫法類似于CC+語言的寫法,數(shù)學(xué)函數(shù)的參數(shù)可以是任意表達式,多個參數(shù)之間用逗號隔開。例如:%set x 22% expr 2* sin($x0 . elseif $x1 . elseif $x2 . else . 注意,上例中一定要寫在上一行,因為如果不這樣,TCL 解釋器會認為if命令在換行符處已結(jié)束,下一行會被當(dāng)成新的命令,從而導(dǎo)致錯誤的結(jié)果。在下面的循環(huán)命令的書寫中也要注意這個問題。書寫中還要注意的一個問題是if 和之間應(yīng)該有一個空格,否則TCL解釋器會把if作為一個整體當(dāng)

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

24、一個表達式,用來決定循環(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)體一次。 下例與上例作用相同:set b foreach i $aset

25、 b linsert $b 0 $i2。 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 foreach i a b c j d e f g la

26、ppend 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命令結(jié)束整個循環(huán)過程,并從循環(huán)中跳出,continue只是結(jié)束本次循環(huán)。switch 命令和C語言中switch語句一樣,TCL中的switch命令也可以由if命令實現(xiàn)。只是書寫起來較為煩瑣。 switch命令的語法為: switch ? opti

27、ons? 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 incr t1c incr t2default incr t3

28、其中a的后面跟一個表示使用和下一個模式相同的腳本。default表示匹配任意值。一旦switch命令 找到一個模式匹配,就執(zhí)行相應(yīng)的腳本,并返回腳本的值,作為switch命令的返回值。eval命令eval命令是一個用來構(gòu)造和執(zhí)行TCL腳本的命令,其語法為:eval arg ?arg .?它可以接收一個或多個參數(shù),然后把所有的參數(shù)以空格隔開組合到一起成為一個腳本,然后對這個腳本進行求值。例如:eval set a 2 ;set b 44source命令source命令讀一個文件并把這個文件的內(nèi)容作為一個腳本進行求值。例如:source e:/tcl&c/hello.tcl 注意路徑的描述應(yīng)該和U

29、NIX相同,使用/而不是。過程(procedure)TCL支持過程的定義和調(diào)用,在TCL中,過程可以看作是用TCL腳本實現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數(shù)。過程定義和返回值TCL中過程是由proc命令產(chǎn)生的:例如:% proc add x y expr $x+$yproc命令的第一個參數(shù)是你要定義的過程的名字,第二個參數(shù)是過程的參數(shù)列表,參數(shù)之間用空格隔開,第三個參數(shù)是一個TCL腳本,代表過程體。 proc生成一個新的命令,可以象固有命令一樣調(diào)用:% add 1 2 3 在定義過程時,你可以利用return命令

30、在任何地方返回你想要的值。 return命令迅速中斷過程,并把它的參數(shù)作為過程的結(jié)果。例如:% proc abs x if $x = 0 return $x return expr -$x過程的返回值是過程體中最后執(zhí)行的那條命令的返回值。局部變量和全局變量 對于在過程中定義的變量,因為它們只能在過程中被訪問,并且當(dāng)過程退出時會被自動刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內(nèi)部;全局變量的作用域則不包括所有過程的內(nèi)部。這一點和C語言有很大的不同. 如果我們想在過程內(nèi)部引用一個

31、全局變量的值,可以使用global命令。例如:% set a 44% proc sample x global aincr a return expr $a+$x% sample 38%set a5 全局變量a在過程中被訪問。在過程中對a的改變會直接反映到全局上。如果去掉語句global a,TCL會出錯,因為它不認識變量a. 缺省參數(shù)和可變個數(shù)參數(shù)TCL還提供三種特殊的參數(shù)形式:首先,你可以定義一個沒有參數(shù)的過程,例如:proc add expr 2+3其次,可以定義具有缺省參數(shù)值的過程,我們可以為過程的部分或全部參數(shù)提供缺省值,如果調(diào)用過程時未提供那些參數(shù)的值,那么過程會自動使用缺省值賦給

32、相應(yīng)的參數(shù)。和CC+中具有缺省參數(shù)值的函數(shù)一樣,有缺省值的參數(shù)只能位于參數(shù)列表的后部,即在第一個具有缺省值的參數(shù)后面的所有參數(shù),都只能是具有缺省值的參數(shù)。例如:proc add val1 val2 2 val3 3 expr $val1+$val2+$val3則:add 1 /值為6add 2 20 /值為25add 4 5 6 /值為15另外,TCL的過程定義還支持可變個數(shù)的參數(shù),如果過程的最后一個參數(shù)是args, 那么就表示這個過程支持可變個數(shù)的參數(shù)調(diào)用。調(diào)用時,位于args以前的參數(shù)象普通參數(shù)一樣處理,但任何附加的參數(shù)都需要在過程體中作特殊處理,過程的局部變量args將會被設(shè)置為一個列表

33、,其元素就是所有附加的變量。如果沒有附加的變量,args就設(shè)置成一個空串,下面是一個例子:proc add val1 args set sum $val1 foreach i $args incr sum $i return $sum 則:add 2 /值為2add 2 3 4 5 6 /值為20引用:upvar命令語法:upvar ?level? otherVar myVar ?otherVar myVar .?upvar命令使得用戶可以在過程中對全局變量或其他過程中的局部變量進行訪問。 upvar命令的第一個參數(shù)otherVar是我們希望以引用方式訪問的參數(shù)的名字,第二個參數(shù)myVar 是

34、這個過程中的局部變量的名字,一旦使用了upvar 命令把otherVar 和myVar 綁定,那么在過程中對局部變量myVar 的讀寫就相當(dāng)于對這個過程的調(diào)用者中otherVar 所代表的局部變量的讀寫。下面是一個例子:% proc temp arg upvar $arg bset b expr $b+2% proc myexp var set a 4temp areturn expr $var+$a 則:% myexp 7 13這個例子中,upvar 把$arg(實際上是過程myexp中的變量a)和過程temp中的變量b綁定,對b的讀寫就相當(dāng)于對a的讀寫。upvar命令語法中的level參數(shù)

35、表示:調(diào)用upvar命令的過程相對于我們希望引用的變量myVar在調(diào)用棧中相對位置。例如:upvar 2 other x這個命令使得當(dāng)前過程的調(diào)用者的調(diào)用者中的變量other,可以在當(dāng)前過程中利用x訪問。缺省情況下,level的值為1,即當(dāng)前過程(上例中的temp)的調(diào)用者(上例中的myexp)中的變量(上例中myexp的a)可以在當(dāng)前過程中利用局部變量(上例中temp的b)訪問。如果要訪問全局變量可以這樣寫:upvar 0 other x那么,不管當(dāng)前過程處于調(diào)用棧中的什么位置,都可以在當(dāng)前過程中利用x訪問全局變量other。字符串操作因為TCL把所有的輸入都當(dāng)作字符串看待,所以TCL提供了

36、較強的字符串操作功能,TCL中與字符串操作有關(guān)的命令有:string、format、regexp、regsub、scan等。format命令語法:format formatstring ?vlue value.?format命令類似于ANSIC中的sprintf函數(shù)和MFC中CString類提供的Format成員函數(shù)。它按formatstring提供的格式,把各個value的值組合到formatstring中形成一個新字符串,并返回。例如:%set name johnJohn%set age 2020%set msg format %s is %d years old $name $agejo

37、hn is 20 years oldscan命令語法:scan string format varName ?varName .?scan命令可以認為是format命令的逆,其功能類似于ANSI C中的sscanf函數(shù)。它按format提供的格式分析string字符串,然后把結(jié)果存到變量varName中,注意除了空格和TAB鍵之外,string 和format中的字符和%必須匹配。例如:% scan some26 34 some %d %d a b 2% set a26% set b34% scan 8 %d.%d.%d.%d c d e f4% puts format the value o

38、f c is %d,d is %d,e is %d ,f is %d $c $d $e $fthe value of c is 12,d is 34,e is 56 ,f is 78scan命令的返回值是匹配的變量個數(shù)。而且,我們發(fā)現(xiàn),如果變量varName不存在的話,TCL會自動聲明該變量。regexp命令語法:regexp ?switchs? ?-? exp string ?matchVar? ?subMatchVar subMatchVar.?regexp命令用于判斷正規(guī)表達式exp是否全部或部分匹配字符串string,匹配返回1,否則0。在正規(guī)表達式中,一些字符具有特殊的含義,下表一一

39、列出,并給予了解釋。 字符意義 . 匹配任意單個字符 表示從頭進行匹配 $ 表示從末尾進行匹配 x 匹配字符x,這可以抑制字符x的含義 chars 匹配字符集合chars中給出的任意字符,如果chars中的第一個字符是,表示匹配任意不在chars中的字符,chars的表示方法支持a-z之類的表示。(regexp)把regexp作為一個單項進行匹配 *對*前面的項0進行次或多次匹配 +對前面的項進行1次或多次匹配 ?對?前面的項進行0次或1次匹配 regexp1|regexp2匹配regexp1或regexp2中的一項下面的一個例子是從Tcl and Tk ToolKit中摘下來的,下面進行說明

40、:(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之類不是數(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到

41、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命令后面有參數(shù)matchVar和subMatchVar,則所有的參數(shù)被當(dāng)作變量名,如果變量不存在,就會被生成。 regexp把匹配整個正規(guī)表達式的子字符串賦給第一個變量,匹配正規(guī)表達式的最左邊的子表達式的

42、子字符串賦給第二個變量,依次類推,例如:% regexp (0-9+) *(a-z+) there is 100 apples total num word1% puts $total ,$num,$word 100 apples ,100,applesregexp可以設(shè)置一些開關(guān)(switchs,來控制匹配結(jié)果:-nocase 匹配時不考慮大小寫-indices 改變各個變量的值,這是各個變量的值變成了對應(yīng)的匹配子串在整個字符串中所處位置的索引。例如:% regexp -indices (0-9+) *(a-z+) there is 100 apples total num word1% p

43、uts $total ,$num,$word 9 20 ,10 12,15 20正好子串“ 100 apples”的序號是9-20,100的序號是10-12,apples的序號是15-20- 表示這后面再沒有開關(guān) (switchs了,即使后面有以-開頭的參數(shù)也被當(dāng)作正規(guī)表達式的一部分。regsub命令語法:regsub ?switchs? exp string subSpec varnameregsub的第一個參數(shù)是一個整個表達式,第二個參數(shù)是一個輸入字符串,這一點和regexp命令完全一樣,也是當(dāng)匹配時返回1,否則返回0。不過regsub用第三個參數(shù)的值來替換字符串string中和正規(guī)表達式

44、匹配的部分,第四個參數(shù)被認為是一個變量,替換后的字符串存入這個變量中。例如:% regsub there They live there lives their x1% puts $xThey live their lives這里there被用their替換了。regsub命令也有幾個開關(guān)(switchs):-nocase 意義同regexp命令中。-all 沒有這個開關(guān)時,regsub只替換第一個匹配,有了這個開關(guān),regsub將把所有匹配的地方全部替換。- 意義同regexp命令中。string命令string命令的語法:string option arg ?arg.?string命令具有

45、強大的操作字符串的功能,其中的option選項多達20個。下面介紹其中常用的部分。string compare ?-nocase? ?-length int? string1 string2 把字符串string1和string2進行比較,返回值為-1、0或1,分別對應(yīng)string1小于、等于或大于string2。如果有 -length 參數(shù),那么只比較前 int 個字符,如果 int為負數(shù),那么這個參數(shù)被忽略。 如果有 -nocase參數(shù),那么比較時不區(qū)分大小寫。string equal ?-nocase? ?-length int? string1 string2把字符串string1和s

46、tring2進行比較,如果兩者相同,返回值為1,否則返回0。其他參數(shù)與8.5.1同。string first string1 string2 ?startindex? 在string2 中從頭查找與string1匹配的字符序列,如果找到,那么就返回匹配的第一個字母所在的位置(0-based)。如果沒有找到,那么返回-1。如果給出了startindex變量,那么將從startindex處開始查找。例如:% string first ab defabc3% string first ab defabc 4-1string index string charIndex 返回string 中第char

47、Index個字符(0-based)。charIndex可以是下面的值: 整數(shù)n: 字符串中第n個字符(0-based) end : 最后一個字符 end整數(shù)n:倒數(shù)第n個字符。string index abcd end-1 返回字符c 如果charIndex小于0,或者大于字符串string的長度,那么返回空。例如:% string index abcdef 2c% string index abcdef end-2dstring last string1 string2 ?startindex?參照8.5.3.唯一的區(qū)別是從后往前查找string length string返回字符串stri

48、ng的長度.string match ?-nocase? pattern string 如果pattern 匹配string,那么返回1,否則返回0.如果有-nocase參數(shù),那么就不區(qū)分大小寫.在pattern 中可以使用通配符:* 匹配string中的任意長的任意字符串,包括空字符串.? 匹配string中任意單個字符chars 匹配字符集合chars中給出的任意字符,其中可以使用 A-Z這種形式x 匹配單個字符x,使用是為了讓x可以為字符*,-,.例子:% string match * abcdef1% string match a* abcdef1string match a?cdef

49、 abcdef1% string match ab-fcdef abcdef /注意一定藥用,否則TCL解釋器會把b-f當(dāng)作命令名1 /從而導(dǎo)致錯誤% string match ab-fcdef accdef1string range string first last 返回字符串string中從第first個到第last個字符的子字符串(0-based)。如果first0,那么first被看作0,如果last大于或等于字符串的長度,那么last被看作end,如果first比last大,那么返回空。string repeat string count 返回值為:重復(fù)了string字符串coun

50、t次的字符串。例如:% string repeat abc 2abcabc string replace string first last ?newstring? 返回值為:從字符串string 中刪除了第first到第last個字符(0-based)的字符串,如果給出了newstring變量,那么就用newstring替換從第first到第last個字符。如果first defstring trimleft string ?chars? 同8.5.13。不過只刪除左邊的字符。string trimright string ?chars? 同8.5.13。不過只刪除右邊的字符。文件訪問TCL

51、提供了豐富的文件操作的命令。通過這些命令你可以對文件名進行操作(查找匹配某一模式的文件)、以順序或隨機方式讀寫文件、檢索系統(tǒng)保留的文件信息(如最后訪問時間)。文件名TCL中文件名和我們熟悉的windows表示文件的方法有一些區(qū)別:在表示文件的目錄結(jié)構(gòu)時它使用/,而不是,這和TCL最初是在UNIX下實現(xiàn)有關(guān)。比如C盤tcl目錄下的文件sample.tcl在TCL中這樣表示:C:/tcl/sample.tcl。 基本文件輸入輸出命令這個名為tgrep的過程,可以說明TCL文件I/O的基本特點:proc tgrep pattern filename set f open $filename rwhi

52、le gets $f line if regexp $pattern $line puts stdout $line close $f 以上過程非常象UNIX的grep命令, 你可以用兩個參數(shù)調(diào)用它,一個是模式,另一個是文件名,tgrep將打印出文件中所有匹配該模式的行。下面介紹上述過程中用到的幾個基本的文件輸入輸出命令。open name ?access? open命令 以access方式打開文件name。返回供其他命令(gets,close等)使用的文件標識。如果name的第一個字符是“|”,管道命令被觸發(fā),而不是打開文件。文件的打開方式和我們熟悉的C語言類似,有以下方式:r只讀方式打開。

53、文件必須已經(jīng)存在。這是默認方式。r+讀寫方式打開,文件必須已經(jīng)存在。w只寫方式打開文件,如果文件存在則清空文件內(nèi)容,否則創(chuàng)建一新的空文件。w+讀寫方式打開文件,如文件存在則清空文件內(nèi)容,否則創(chuàng)建新的空文件。a只寫方式打開文件,文件必須存在,并把指針指向文件尾。a+讀寫方式打開文件,并把指針指向文件尾。如文件不存在,創(chuàng)建新的空文件。open命令返回一個字符串用于表識打開的文件。當(dāng)調(diào)用別的命令(如:gets,puts,close,對打開的文件進行操作時,就可以使用這個文件標識符。TCL有三個特定的文件標識: stdin,stdout和stderr ,分別對應(yīng)標準輸入、標準輸出和錯誤通道,任何時候你

54、都可以使用這三個文件標識。gets fileId ?varName? 讀fileId標識的文件的下一行,忽略換行符。如果命令中有varName就把該行賦給它,并返回該行的字符數(shù)(文件尾返回-1),如果沒有varName參數(shù),返回文件的下一行作為命令結(jié)果(如果到了文件尾,就返回空字符串)。和gets類似的命令是read,不過read不是以行為單位的,它有兩種形式:read ?-nonewline? fileId 讀并返回fileId標識的文件中所有剩下的字節(jié)。如果沒有nonewline開關(guān),則在換行符處停止。read fileId numBytes 在fileId標識的文件中讀并返回下一個num

55、bytes字節(jié)。puts ?-nonewline? ?fileId? string puts命令把string寫到fileId中,如果沒有nonewline開關(guān)的話,添加換行符。fileId默認是stdout。命令返回值為一空字符串。puts命令使用C的標準I/O庫的緩沖區(qū)方案,這就意味著使用puts產(chǎn)生的信息不會立即出現(xiàn)在目標文件中。如果你想使數(shù)據(jù)立即出現(xiàn)在文件中,那你就調(diào)用flush命令:flush fileId 把緩沖區(qū)內(nèi)容寫到fileId標識的文件中,命令返回值為空字符串。flush命令迫使緩沖區(qū)數(shù)據(jù)寫到文件中。flush直到數(shù)據(jù)被寫完才返回。當(dāng)文件關(guān)閉時緩沖區(qū)數(shù)據(jù)會自動flush。c

56、lose ?fileId? 關(guān)閉標識為fileId的文件,命令返回值為一空字符串。這里特別說明的一點是,TCL中對串口、管道、socket等的操作和對文件的操作類似,以上對文件的操作命令同樣適用于它們。隨機文件訪問默認文件輸入輸出方式是連續(xù)的:即每個gets或爎ead命令返回的是上次gets或爎ead訪問位置后面的字節(jié),每個puts命令寫數(shù)據(jù)是接著上次puts寫的位置接著寫。TCL提供了seek,tell和eof等命令使用戶可以非連續(xù)訪問文件。每個打開的打開文件都有訪問點,即下次讀寫開始的位置。文件打開時,訪問點總是被設(shè)置為文件的開頭或結(jié)尾,這取決于打開文件時使用的訪問模式。每次讀寫后訪問位置

57、按訪問的字節(jié)數(shù)后移相應(yīng)的位數(shù)??梢允褂胹eek命令來改變文件的訪問點:seek fileId offset ?origin? 把fileId標識的文件的訪問點設(shè)置為相對于origin偏移量為offset的位置。origin可以是start,current,end,默認是start。命令的返回值是一空字符串。例如:seek fileId 2000 改變fieleId標識的文件訪問點,以便下次讀寫開始于文件的第2000個字節(jié)。seek的第三個參數(shù)說明偏移量從哪開始計算。第三個參數(shù)必為start,current或end中的一個。start是默認值:即偏移量是相對文件開始處計算。current是偏移量

58、從當(dāng)前訪問位置計算。end是偏移量從文件尾開始計算。tell fileId 返回fileId標識的文件的當(dāng)前訪問位置。eof fileId 如果到達fileId標識的文件的末尾返回1,否則返回0。 當(dāng)前工作目錄TCL提供兩個命令來管理當(dāng)前工作目錄:pwd和Cd。pwd和UNIX下的pwd命令完全一樣, 沒有參數(shù),返回當(dāng)前目錄的完整路徑。cd 命令也和UNIX命令也一樣,使用一個參數(shù),可以把工作目錄改變?yōu)閰?shù)提供的目錄。如果cd 沒使用參數(shù),UNIX下,會把工作目錄變?yōu)閱覶CL腳本的用戶的工作目錄,WINDOWS下會把工作目錄變?yōu)閣indows操作系統(tǒng)的安裝目錄所在的盤的根目錄(如:C:/)。

59、值得注意的是,提供給cd的參數(shù)中路徑中的應(yīng)該用/而不是。如 cd C:/TCL/lib。這是UNIX的風(fēng)格。文件操作和獲取文件信息TCL提供了兩個命令進行文件名操作:glob和file,用來操作文件或獲取文件信息。glob命令采用一種或多種模式作為參數(shù),并返回匹配這個(些)模式的所有文件的列表,其語法為:glob ?switches? pattern ?pattern .?其中switches可以取下面的值:-nocomplain :允許返回一個空串,沒有-nocomplain時,如果結(jié)果是空的,就返回錯誤。- :表示switches結(jié)束,即后面以-開頭的參數(shù)將不作為switches。glob

60、命令的模式采用string match命令(見8.5.7節(jié))的匹配規(guī)則。例如:%glob *.c *.hmain.c hash.c hash.h返回當(dāng)前目錄中所有.c或.h的文件名。 glob 還允許模式中包含 括在花括號中間以逗號分開的多種選擇,例如 : %glob src,backup/*.chsrc/main.c src/hash.c src/hash.h backup/hash.c下面的命令和上面的命令等價:glob src/*.ch backup/*.ch注意:這些例子中模式周圍的花括號是必須的,可以防止命令置換。在調(diào)用glob命令對應(yīng)的C過程前這些括號會被TCL解釋器去掉。如果gl

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論