TCL培訓(xùn)教程全教學(xué)教材_第1頁(yè)
TCL培訓(xùn)教程全教學(xué)教材_第2頁(yè)
TCL培訓(xùn)教程全教學(xué)教材_第3頁(yè)
TCL培訓(xùn)教程全教學(xué)教材_第4頁(yè)
TCL培訓(xùn)教程全教學(xué)教材_第5頁(yè)
已閱讀5頁(yè),還剩123頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Good is good, but better carries it.精益求精,善益求善。TCL培訓(xùn)教程全深圳市華為技術(shù)有限公司研究管理部文檔中心文檔編號(hào)產(chǎn)品版本密級(jí)產(chǎn)品名稱:測(cè)試平臺(tái)共numpages*MERGEFORMAT60頁(yè)TCL培訓(xùn)教程(全)(僅供內(nèi)部使用)擬制:陳旭盛日期:2000/12/08審核:日期:yyyy/mm/dd審核:日期:yyyy/mm/dd批準(zhǔn):日期:yyyy/mm/dd深圳市華為技術(shù)有限公司版權(quán)所有侵權(quán)必究修訂記錄用于說(shuō)明對(duì)文檔加附頁(yè)或文檔版本升級(jí)時(shí)對(duì)文檔的改動(dòng)情況,一般設(shè)計(jì)類文檔日期修訂版本描述作者2000/12/082.00初稿完成陳旭盛目錄1引言62語(yǔ)法7

2、2.1腳本、命令和單詞符號(hào)72.2置換(substitution)72.2.1變量置換(variablesubtitution)82.2.2命令置換(commandsubstitution)82.2.3反斜杠置換(backslashsubstitution)82.2.4雙引號(hào)和花括號(hào)92.3注釋93變量103.1簡(jiǎn)單變量103.2數(shù)組113.3相關(guān)命令113.3.1set113.3.2unset113.3.3append和incr124表達(dá)式124.1操作數(shù)124.2運(yùn)算符和優(yōu)先級(jí)124.3數(shù)學(xué)函數(shù)135List145.1list命令145.2concat命令:145.3lindex命令155

3、.4llength命令155.5linsert命令155.6lreplace命令:155.7lrange命令:155.8lappend命令:155.9lsearch命令:165.10lsort命令:165.11split命令:165.12join命令176控制流176.1if命令176.2循環(huán)命令:while、for、foreach176.2.1while命令176.2.2for命令186.2.3foreach命令186.2.4break和continue命令196.2.5switch命令196.1eval命令196.2source命令197過(guò)程(procedure)207.1過(guò)程定義和返回值

4、207.2局部變量和全局變量207.3缺省參數(shù)和可變個(gè)數(shù)參數(shù)217.4引用:upvar218字符串操作228.1format命令228.2scan命令238.3regexp命令238.4regsub命令258.5string命令258.5.1stringcompare?-nocase?-lengthint?string1string2258.5.2stringequal?-nocase?-lengthint?string1string2258.5.3stringfirststring1string2?startindex?268.5.4stringindexstringcharIndex268

5、.5.5stringlaststring1string2?startindex?268.5.6stringlengthstring268.5.7stringmatch?-nocase?patternstring268.5.8stringrangestringfirstlast278.5.9stringrepeatstringcount278.5.10stringreplacestringfirstlast?newstring?278.5.11stringtolowerstring?first?last?278.5.12stringtoupperstring?first?last?278.5.1

6、3stringtrimstring?chars?278.5.14stringtrimleftstring?chars?278.5.15stringtrimrightstring?chars?279文件訪問(wèn)289.1文件名289.2基本文件輸入輸出命令289.3隨機(jī)文件訪問(wèn)299.4當(dāng)前工作目錄309.5文件操作和獲取文件信息3010錯(cuò)誤和異常3310.1錯(cuò)誤3310.2從TCL腳本中產(chǎn)生錯(cuò)誤3410.3使用catch捕獲錯(cuò)誤3510.4其他異常3511深入TCL3711.1查詢數(shù)組中的元素3711.2info命令3811.2.1變量信息3811.2.2過(guò)程信息3911.2.3命令信息4011.

7、2.4TCL的版本和庫(kù)4111.2.5命令的執(zhí)行時(shí)間4111.2.6跟蹤變量4111.2.7命令的重命名和刪除4311.2.8unknown命令4411.2.9自動(dòng)加載4412歷史記錄4513TCL和CC+4713.1生成自己的TCLSH4813.2擴(kuò)展自己的命令:方法(一)4813.2.1編寫擴(kuò)展命令對(duì)應(yīng)的C/C+過(guò)程4813.2.2注冊(cè)命令4913.2.3命令返回值和命令對(duì)應(yīng)的過(guò)程的返回值5013.3擴(kuò)展自己的命令:方法(二)5213.3.1Tcl_Obj結(jié)構(gòu)5213.3.2編寫擴(kuò)展命令對(duì)應(yīng)的C/C+過(guò)程5413.3.3注冊(cè)命令5413.4利用clientData參數(shù)和deleteProc

8、參數(shù)5513.5在C/C+應(yīng)用程序中嵌入TCL5814總結(jié)59TCL培訓(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ǔ)清單:TCLToolCommandLanguage一種腳本語(yǔ)言參考資料清單:請(qǐng)?jiān)诒砀裰辛_列本文檔所引用的有關(guān)參考文獻(xiàn)名稱、作者、標(biāo)題、編號(hào)、發(fā)布日期和出版單位等基本信息。參考資料清單名稱作者編號(hào)發(fā)布日期查閱地點(diǎn)或渠道出版單位(若不為本公司發(fā)布的文獻(xiàn),請(qǐng)?zhí)顚懘肆校㏕cl

9、andTkToolKitJohnK.Ousterhout98123595161999自己的圖書(shū)AddisonWesleyPublishingCommpanyTCL的使用陳旭盛自寫文檔TCL培訓(xùn)教程陳旭盛自寫文檔引言TCL(ToolCommandLanguage)是一種解釋執(zhí)行的腳本語(yǔ)言(ScriptingLanguage)。它提供了通用的編程能力:支持變量、過(guò)程和控制結(jié)構(gòu);同時(shí)TCL還擁有一個(gè)功能強(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)

10、用程序中嵌入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ù)類型、對(duì)過(guò)程的支持等。根據(jù)需要,我們甚至可以屏蔽掉TCL的某些固有命令和固有控制結(jié)構(gòu)。通過(guò)對(duì)TCL的擴(kuò)展、繼承或屏蔽,用戶用不著象平時(shí)定義一種計(jì)算機(jī)語(yǔ)言那樣對(duì)詞法、語(yǔ)法、語(yǔ)義、語(yǔ)用等各方面加以定義,就可以方便的為自己的應(yīng)用領(lǐng)域提供一種

11、功能完備的腳本語(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)門CL是一種比CC+語(yǔ)言有著更高抽象層次的語(yǔ)言,使用TCL可以在一種更高的層次上編寫程序,它屏蔽掉了編寫CC+程序時(shí)必須涉及到的一些較為煩瑣的細(xì)節(jié),可以大大地提高開(kāi)發(fā)測(cè)試?yán)乃俣?。而且,使用TCL語(yǔ)言寫的測(cè)試?yán)_本,即使作了修改,也用不著重新編譯就可以調(diào)用TCL解釋器直接執(zhí)行??梢允s不少時(shí)間。T

12、CL目前已成為自動(dòng)測(cè)試中事實(shí)上的標(biāo)準(zhǔn)。語(yǔ)法簡(jiǎn)單的講,TCL語(yǔ)言的語(yǔ)法實(shí)際上是一些TCL解釋器怎樣對(duì)TCL命令進(jìn)行分析的規(guī)則的集合。腳本、命令和單詞符號(hào)一個(gè)TCL腳本可以包含一個(gè)或多個(gè)命令。命令之間必須用換行符或分號(hào)隔開(kāi),下面的兩個(gè)腳本都是合法的:seta1setb2或seta1;setb2TCL的每一個(gè)命令包含一個(gè)或幾個(gè)單詞,第一個(gè)單詞代表命令名,另外的單詞則是這個(gè)命令的參數(shù),單詞之間必須用空格或TAB鍵隔開(kāi)。TCL解釋器對(duì)一個(gè)命令的求值過(guò)程分為兩部分:分析和執(zhí)行。在分析階段,TCL解釋器運(yùn)用規(guī)則把命令分成一個(gè)個(gè)獨(dú)立的單詞,同時(shí)進(jìn)行必要的置換(substitution);在執(zhí)行階段,TCL解釋

13、器會(huì)把第一個(gè)單詞當(dāng)作命令名,并查看這個(gè)命令是否有定義,如果有定義就激活這個(gè)命令對(duì)應(yīng)的C/C+過(guò)程,并把所有的單詞作為參數(shù)傳遞給該命令過(guò)程,讓命令過(guò)程進(jìn)行處理。置換(substitution)注:在下面的所有章節(jié)的例子中,為TCL的命令提示符,輸入命令回車后,TCL會(huì)在接著的一行輸出命令執(zhí)行結(jié)果。/后面是我自己加上的說(shuō)明,不是例子的一部分。TCL解釋器在分析命令時(shí),把所有的命令參數(shù)都當(dāng)作字符串看待,例如:%setx10/定義變量x,并把x的值賦為1010%setyx+100/y的值是x+100,而不是我們期望的110 x+100上例的第二個(gè)命令中,x被看作字符串x+100的一部分,如果我們想使用

14、x的值10,就必須告訴TCL解釋器:我們?cè)谶@里期望的是變量x的值,而非字符x。怎么告訴TCL解釋器呢,這就要用到TCL語(yǔ)言中提供的置換功能。TCL提供三種形式的置換:變量置換、命令置換和反斜杠置換。每種置換都會(huì)導(dǎo)致一個(gè)或多個(gè)單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內(nèi)的每一個(gè)單詞中,而且置換可以嵌套。變量置換(variablesubtitution)變量置換由一個(gè)符號(hào)標(biāo)記,變量置換會(huì)導(dǎo)致變量的值插入一個(gè)單詞中。例如:%sety$x+100/y的值是10+100,這里x被置換成它的值1010100這時(shí),y的值還不是我們想要的值110,而是10+100,因?yàn)門CL解釋器把10+100看成

15、是一個(gè)字符串而不是表達(dá)式,y要想得到值110,還必須用命令置換,使得TCL會(huì)把10+100看成一個(gè)表達(dá)式并求值。命令置換(commandsubstitution)命令置換是由括起來(lái)的TCL命令及其參數(shù),命令置換會(huì)導(dǎo)致某一個(gè)命令的所有或部分單詞被另一個(gè)命令的結(jié)果所代替。例如:%setyexpr$x+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è)單詞作為看

16、作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。注意,中必須是一個(gè)合法的TCL腳本,長(zhǎng)度不限。中腳本的值為最后一個(gè)命令的返回值,例如:%setyexpr$x+100;setb300/y的值為300,因?yàn)閟etb300的返回值為300300有了命令置換,實(shí)際上就表示命令之間是可以嵌套的,即一個(gè)命令的結(jié)果可以作為別的命令的參數(shù)。反斜杠置換(backslashsubstitution)TCL語(yǔ)言中的反斜杠置換類似于C語(yǔ)言中反斜杠的用法,主要用于在單詞符號(hào)中插入諸如換行符、空格、$等被TCL解釋器當(dāng)作特殊符號(hào)對(duì)待的字符。例如:setmsgmultiplespace/msg的值為multipl

17、espace。如果沒(méi)有的話,TCL會(huì)報(bào)錯(cuò),因?yàn)榻忉屍鲿?huì)把這里最后兩個(gè)單詞之間的空格認(rèn)為是分隔符,于是發(fā)現(xiàn)set命令有多于兩個(gè)參數(shù),從而報(bào)錯(cuò)。加入了后,空格不被當(dāng)作分隔符,multiplespace被認(rèn)為是一個(gè)單詞(word)。又例如:%setmsgmoney$3333nArraya2/這個(gè)命令的執(zhí)行結(jié)果為:money$3333Arraya2這里的$不再被當(dāng)作變量置換符。TCL支持以下的反斜杠置換:BackslashSequenceReplacedByaAudiblealert(0 x7)bBackspace(0 x8)fFormfeed(0 xc)nNewline(0 xa)rCarriage

18、return(0 xd)tTab(0 x9)vVerticaltab(0 xb)dddOctalvaluegivenbyddd(one,two,orthreeds)xhhHexvaluegivenbyhh(anynumberofhs)newlinespaceAsinglespacecharacter.例如:setax48/對(duì)應(yīng)xhhH/十六進(jìn)制的48正好是72,對(duì)應(yīng)Hseta110/對(duì)應(yīng)dddH/八進(jìn)制的110正好是72,對(duì)應(yīng)Hsetaexpr/對(duì)應(yīng)newlinespace,一個(gè)命令可以用newline轉(zhuǎn)到下一行繼續(xù)2+35雙引號(hào)和花括號(hào)除了使用反斜杠外,TCL提供另外兩種方法來(lái)使得解釋器把分

19、隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號(hào)和花括號(hào)()。TCL解釋器對(duì)雙引號(hào)中的各種分隔符將不作處理,但是對(duì)換行符及和兩種置換符會(huì)照常處理。例如:%setx100100%sety$xddd100ddd而在花括號(hào)中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會(huì)對(duì)其作特殊處理。%sety/n$xexpr10+100/n$xexpr10+100注釋TCL中的注釋符是,和直到所在行結(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對(duì)注釋將不作任何處理。不過(guò),要注意的是,必須出現(xiàn)在TCL解釋器期望命令的第一個(gè)字符出現(xiàn)的地方,才被當(dāng)作注釋。例如:%Thisisaco

20、mment%seta100#Notacommentwrong#args:shouldbesetvarName?newValue?%setb101;#thisisacomment101第二行中就不被當(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)作注釋了。變量TCL支持兩種類型的變量:簡(jiǎn)單變量和數(shù)組。簡(jiǎn)單變量一個(gè)TCL的簡(jiǎn)單變量包含兩個(gè)部分:名字和值。名字和值都可以是任意字符串。例如一個(gè)名為“13237&*:hdgg

21、的變量在TCL中都是合法的。不過(guò)為了更好的使用置換(substitution),變量名最好按CC+語(yǔ)言中標(biāo)識(shí)符的命名規(guī)則命名。TCL解釋器在分析一個(gè)變量置換時(shí),只把從符號(hào)往后直到第一個(gè)不是字母、數(shù)字或下劃線的字符之間的單詞符號(hào)作為要被置換的變量的名字。例如:%seta22seta.144%setb$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。這顯然與我們的初衷不同。當(dāng)然,如果

22、變量名中有不是字母、數(shù)字或下劃線的字符,又要用置換,可以用花括號(hào)把變量名括起來(lái)。例如:%setb$a.14TCL中的set命令能生成一個(gè)變量、也能讀取或改變一個(gè)變量的值。例如:setakdfjkjdfkdfjkjdf如果變量a還沒(méi)有定義,這個(gè)命令將生成變量a,并將其值置為kdfjkjdf,若a已定義,就簡(jiǎn)單的把a(bǔ)的值置為kdfjkjdf。setakdfjkjdf這個(gè)只有一個(gè)參數(shù)的set命令讀取a的當(dāng)前值kdfjkjdf。數(shù)組數(shù)組是一些元素的集合。TCL的數(shù)組和普通計(jì)算機(jī)語(yǔ)言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨(dú)聲明一個(gè)數(shù)組,數(shù)組只能和數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組

23、名和數(shù)組中元素的名字,TCL中數(shù)組元素的名字(下標(biāo)可以為任何字符串。例如:setday(monday)1setday(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)單變量類似。例:setamondaysetday(monday)1setb$day(monday)/b的值為1,即day(monday)的值。setc$day($a)/c的值為1,即day(monday)的值。

24、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ù)組元素。例如:%unsetabday(monday)上面的語(yǔ)句中刪除了變量a、b和數(shù)組元素day(monday),但是數(shù)組day并沒(méi)有刪除,其他元素還存在,要?jiǎng)h除整個(gè)數(shù)組,只需給出數(shù)組的名字。例如:%puts$day(monday)cantreadday(monday):nosuchelementinarray%p

25、uts$day(tuesday)2%unsetday%puts$day(tuesday)cantreadday(tuesday):nosuchvariableappend和incr這兩個(gè)命令提供了改變變量的值的簡(jiǎn)單手段。append命令把文本加到一個(gè)變量的后面,例如:%settxthellohello%appendtxt!Howareyouhello!Howareyouincr命令把一個(gè)變量值加上一個(gè)整數(shù)。incr要求變量原來(lái)的值和新加的值都必須是整數(shù)。%setbaa%incrbexpectedintegerbutgota%setb22%incrb35表達(dá)式TCL中的表達(dá)式類似于ANSIC的表

26、達(dá)式。表達(dá)式由操作數(shù)和操作符構(gòu)成,下面分別介紹。操作數(shù)TCL表達(dá)式的操作數(shù)通常是整數(shù)或?qū)崝?shù)。整數(shù)一般是十進(jìn)制的,但如果整數(shù)的第一個(gè)字符是0(zero),那么TCL將把這個(gè)整數(shù)看作八進(jìn)制的,如果前兩個(gè)字符是0 x則這個(gè)整數(shù)被看作是十六進(jìn)制的。TCL的實(shí)數(shù)的寫法與ANSIC中完全一樣。如:2.17.9e+126e43.運(yùn)算符和優(yōu)先級(jí)下面的表格中列出了TCL中用到的運(yùn)算符,它們的語(yǔ)法形式和用法跟ANSIC中很相似。這里就不一一介紹。下表中的運(yùn)算符是按優(yōu)先級(jí)從高到低往下排列的。同一格中的運(yùn)算符優(yōu)先級(jí)相同。語(yǔ)法形式結(jié)果操作數(shù)類型-a!aa負(fù)a非aint,floatint,floatinta*ba/ba%

27、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邏輯或int,floata?b:c選擇運(yùn)算a:int,float數(shù)學(xué)函數(shù)TCL支持常用的數(shù)學(xué)函數(shù),表達(dá)式中數(shù)學(xué)函數(shù)的寫法類

28、似于CC+語(yǔ)言的寫法,數(shù)學(xué)函數(shù)的參數(shù)可以是任意表達(dá)式,多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)。例如:%setx22%expr2*sin($x0elseif$x1elseif$x2else注意,上例中一定要寫在上一行,因?yàn)槿绻贿@樣,TCL解釋器會(huì)認(rèn)為if命令在換行符處已結(jié)束,下一行會(huì)被當(dāng)成新的命令,從而導(dǎo)致錯(cuò)誤的結(jié)果。在下面的循環(huán)命令的書(shū)寫中也要注意這個(gè)問(wèn)題。書(shū)寫中還要注意的一個(gè)問(wèn)題是if和之間應(yīng)該有一個(gè)空格,否則TCL解釋器會(huì)把if作為一個(gè)整體當(dāng)作一個(gè)命令名,從而導(dǎo)致錯(cuò)誤。循環(huán)命令:while、for、foreachwhile命令語(yǔ)法為:whiletestbody參數(shù)test是一個(gè)表達(dá)式,body是一個(gè)腳本

29、,如果表達(dá)式的值非0,就運(yùn)行腳本,直到表達(dá)式為0才停止循環(huán),此時(shí)while命令中斷并返回一個(gè)空字符串。例如:假設(shè)變量a是一個(gè)鏈表,下面的腳本把a(bǔ)的值復(fù)制到b:setbsetiexprllength$a-1while$i=0lappendblindex$a$iincri-1for命令語(yǔ)法為:forinittestreinitbody參數(shù)init是一個(gè)初始化腳本,第二個(gè)參數(shù)test是一個(gè)表達(dá)式,用來(lái)決定循環(huán)什么時(shí)候中斷,第三個(gè)參數(shù)reinit是一個(gè)重新初始化的腳本,第四個(gè)參數(shù)body也是腳本,代表循環(huán)體。下例與上例作用相同:setbforsetiexprllength$a-1$i=0incri-1

30、lappendblindex$a$iforeach命令這個(gè)命令有兩種語(yǔ)法形式1。foreachvarNamelistbody第一個(gè)參數(shù)varName是一個(gè)變量,第二個(gè)參數(shù)list是一個(gè)表(有序集合),第三個(gè)參數(shù)body是循環(huán)體。每次取得鏈表的一個(gè)元素,都會(huì)執(zhí)行循環(huán)體一次。下例與上例作用相同:setbforeachi$asetblinsert$b0$i2。foreachvarlist1list1?varlist2list2.?Body這種形式包含了第一種形式。第一個(gè)參數(shù)varlist1是一個(gè)循環(huán)變量列表,第二個(gè)參數(shù)是一個(gè)列表list1,varlist1中的變量會(huì)分別取list1中的值。body參

31、數(shù)是循環(huán)體。?varlist2list2.?表示可以有多個(gè)變量列表和列表對(duì)出現(xiàn)。例如:setxforeachijabcdeflappendx$j$i這時(shí)總共有三次循環(huán),x的值為badcfe。setxforeachiabcjdefglappendx$i$j這時(shí)總共有四次循環(huán),x的值為adbecfg。setxforeachiabcjkdefglappendx$i$j$k這時(shí)總共有三次循環(huán),x的值為adebfgc。break和continue命令在循環(huán)體中,可以用break和continue命令中斷循環(huán)。其中break命令結(jié)束整個(gè)循環(huán)過(guò)程,并從循環(huán)中跳出,continue只是結(jié)束本次循環(huán)。switc

32、h命令和C語(yǔ)言中switch語(yǔ)句一樣,TCL中的switch命令也可以由if命令實(shí)現(xiàn)。只是書(shū)寫起來(lái)較為煩瑣。switch命令的語(yǔ)法為:switch?options?stringpatternbody?patternbody.?第一個(gè)是可選參數(shù)options,表示進(jìn)行匹配的方式。TCL支持三種匹配方式:-exact方式,-glob方式,-regexp方式,缺省情況表示-glob方式。-exact方式表示的是精確匹配,-glob方式的匹配方式和stringmatch命令的匹配方式相同(第八節(jié)介紹),-regexp方式是正規(guī)表達(dá)式的匹配方式(第八節(jié)介紹)。第二個(gè)參數(shù)string是要被用來(lái)作測(cè)試的值,

33、第三個(gè)參數(shù)是括起來(lái)的一個(gè)或多個(gè)元素對(duì),例:switch$xa-bincrt1cincrt2defaultincrt3其中a的后面跟一個(gè)表示使用和下一個(gè)模式相同的腳本。default表示匹配任意值。一旦switch命令找到一個(gè)模式匹配,就執(zhí)行相應(yīng)的腳本,并返回腳本的值,作為switch命令的返回值。eval命令eval命令是一個(gè)用來(lái)構(gòu)造和執(zhí)行TCL腳本的命令,其語(yǔ)法為:evalarg?arg.?它可以接收一個(gè)或多個(gè)參數(shù),然后把所有的參數(shù)以空格隔開(kāi)組合到一起成為一個(gè)腳本,然后對(duì)這個(gè)腳本進(jìn)行求值。例如:evalseta2;setb44source命令source命令讀一個(gè)文件并把這個(gè)文件的內(nèi)容作為一

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

35、命令一樣調(diào)用:%add123在定義過(guò)程時(shí),你可以利用return命令在任何地方返回你想要的值。return命令迅速中斷過(guò)程,并把它的參數(shù)作為過(guò)程的結(jié)果。例如:%procabsxif$x=0return$xreturnexpr-$x過(guò)程的返回值是過(guò)程體中最后執(zhí)行的那條命令的返回值。局部變量和全局變量對(duì)于在過(guò)程中定義的變量,因?yàn)樗鼈冎荒茉谶^(guò)程中被訪問(wèn),并且當(dāng)過(guò)程退出時(shí)會(huì)被自動(dòng)刪除,所以稱為局部變量;在所有過(guò)程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過(guò)程的內(nèi)部;全局變量的作用域則不包括所有過(guò)程的內(nèi)部。這一點(diǎn)和C語(yǔ)言有很

36、大的不同.如果我們想在過(guò)程內(nèi)部引用一個(gè)全局變量的值,可以使用global命令。例如:%seta44%procsamplexglobalaincrareturnexpr$a+$x%sample38%seta5全局變量a在過(guò)程中被訪問(wèn)。在過(guò)程中對(duì)a的改變會(huì)直接反映到全局上。如果去掉語(yǔ)句globala,TCL會(huì)出錯(cuò),因?yàn)樗徽J(rèn)識(shí)變量a.缺省參數(shù)和可變個(gè)數(shù)參數(shù)TCL還提供三種特殊的參數(shù)形式:首先,你可以定義一個(gè)沒(méi)有參數(shù)的過(guò)程,例如:procaddexpr2+3其次,可以定義具有缺省參數(shù)值的過(guò)程,我們可以為過(guò)程的部分或全部參數(shù)提供缺省值,如果調(diào)用過(guò)程時(shí)未提供那些參數(shù)的值,那么過(guò)程會(huì)自動(dòng)使用缺省值賦給相應(yīng)

37、的參數(shù)。和CC+中具有缺省參數(shù)值的函數(shù)一樣,有缺省值的參數(shù)只能位于參數(shù)列表的后部,即在第一個(gè)具有缺省值的參數(shù)后面的所有參數(shù),都只能是具有缺省值的參數(shù)。例如:procaddval1val22val33expr$val1+$val2+$val3則:add1/值為6add220/值為25add456/值為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)有附加

38、的變量,args就設(shè)置成一個(gè)空串,下面是一個(gè)例子:procaddval1argssetsum$val1foreachi$argsincrsum$ireturn$sum則:add2/值為2add23456/值為20引用:upvar命令語(yǔ)法:upvar?level?otherVarmyVar?otherVarmyVar.?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ì)

39、局部變量myVar的讀寫就相當(dāng)于對(duì)這個(gè)過(guò)程的調(diào)用者中otherVar所代表的局部變量的讀寫。下面是一個(gè)例子:%proctempargupvar$argbsetbexpr$b+2%procmyexpvarseta4tempareturnexpr$var+$a則:%myexp713這個(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ì)位置。例如:upvar2otherx這個(gè)命令使得當(dāng)前過(guò)程的調(diào)用者的調(diào)用者中的變量

40、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)全局變量可以這樣寫:upvar0otherx那么,不管當(dāng)前過(guò)程處于調(diào)用棧中的什么位置,都可以在當(dāng)前過(guò)程中利用x訪問(wèn)全局變量other。字符串操作因?yàn)門CL把所有的輸入都當(dāng)作字符串看待,所以TCL提供了較強(qiáng)的字符串操作功能,TCL中與字符串操作有關(guān)的命令有:string、format、regexp、regsub、scan等。format命令語(yǔ)法:formatformat

41、string?vluevalue.?format命令類似于ANSIC中的sprintf函數(shù)和MFC中CString類提供的Format成員函數(shù)。它按formatstring提供的格式,把各個(gè)value的值組合到formatstring中形成一個(gè)新字符串,并返回。例如:%setnamejohnJohn%setage2020%setmsgformat%sis%dyearsold$name$agejohnis20yearsoldscan命令語(yǔ)法:scanstringformatvarName?varName.?scan命令可以認(rèn)為是format命令的逆,其功能類似于ANSIC中的sscanf函數(shù)。它

42、按format提供的格式分析string字符串,然后把結(jié)果存到變量varName中,注意除了空格和TAB鍵之外,string和format中的字符和%必須匹配。例如:%scansome2634some%d%dab2%seta26%setb34%scan8%d.%d.%d.%dcdef4%putsformatthevalueofcis%d,dis%d,eis%d,fis%d$c$d$e$fthevalueofcis12,dis34,eis56,fis78scan命令的返回值是匹配的變量個(gè)數(shù)。而且,我們發(fā)現(xiàn),如果變量varName不存在的話,TCL會(huì)自動(dòng)聲明該變量。regexp命令語(yǔ)法:regex

43、p?switchs?-?expstring?matchVar?subMatchVarsubMatchVar.?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)0

44、進(jìn)行次或多次匹配+對(duì)前面的項(xiàng)進(jìn)行1次或多次匹配?對(duì)?前面的項(xiàng)進(jìn)行0次或1次匹配regexp1|regexp2匹配regexp1或regexp2中的一項(xiàng)下面的一個(gè)例子是從TclandTkToolKit中摘下來(lái)的,下面進(jìn)行說(shuō)明:(0 x)?0-9a-fA-F+|0-9+)$這個(gè)正規(guī)表達(dá)式匹配任何十六進(jìn)制或十進(jìn)制的整數(shù)。兩個(gè)正規(guī)表達(dá)式以|分開(kāi)(0 x)?0-9a-fA-F+和0-9+,表示可以匹配其中的任何一個(gè),事實(shí)上前者匹配十六進(jìn)制,后者匹配的十進(jìn)制。表示必須從頭進(jìn)行匹配,從而上述正規(guī)表達(dá)式不匹配jk12之類不是以0 x或數(shù)字開(kāi)頭的串。表示必須從末尾開(kāi)始匹配,從而上述正規(guī)表達(dá)式不匹配12jk之類不

45、是數(shù)字或a-fA-F結(jié)尾的串。下面以(0 x)?0-9a-fA-F+進(jìn)行說(shuō)明,(0 x)表示0 x一起作為一項(xiàng),?表示前一項(xiàng)(0 x)可以出現(xiàn)0次或多次,0-9a-fA-F表示可以是任意0到9之間的單個(gè)數(shù)字或a到f或A到F之間的單個(gè)字母,表示象前面那樣的單個(gè)數(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命令后面

46、有參數(shù)matchVar和subMatchVar,則所有的參數(shù)被當(dāng)作變量名,如果變量不存在,就會(huì)被生成。regexp把匹配整個(gè)正規(guī)表達(dá)式的子字符串賦給第一個(gè)變量,匹配正規(guī)表達(dá)式的最左邊的子表達(dá)式的子字符串賦給第二個(gè)變量,依次類推,例如:%regexp(0-9+)*(a-z+)thereis100applestotalnumword1%puts$total,$num,$word100apples,100,applesregexp可以設(shè)置一些開(kāi)關(guān)(switchs,來(lái)控制匹配結(jié)果:-nocase匹配時(shí)不考慮大小寫-indices改變各個(gè)變量的值,這是各個(gè)變量的值變成了對(duì)應(yīng)的匹配子串在整個(gè)字符串中所處位

47、置的索引。例如:%regexp-indices(0-9+)*(a-z+)thereis100applestotalnumword1%puts$total,$num,$word920,1012,1520正好子串“100apples”的序號(hào)是9-20,100的序號(hào)是10-12,apples的序號(hào)是15-20-表示這后面再?zèng)]有開(kāi)關(guān)(switchs了,即使后面有以-開(kāi)頭的參數(shù)也被當(dāng)作正規(guī)表達(dá)式的一部分。regsub命令語(yǔ)法:regsub?switchs?expstringsubSpecvarnameregsub的第一個(gè)參數(shù)是一個(gè)整個(gè)表達(dá)式,第二個(gè)參數(shù)是一個(gè)輸入字符串,這一點(diǎn)和regexp命令完全一樣,

48、也是當(dāng)匹配時(shí)返回1,否則返回0。不過(guò)regsub用第三個(gè)參數(shù)的值來(lái)替換字符串string中和正規(guī)表達(dá)式匹配的部分,第四個(gè)參數(shù)被認(rèn)為是一個(gè)變量,替換后的字符串存入這個(gè)變量中。例如:%regsubthereTheylivetherelivestheirx1%puts$xTheylivetheirlives這里there被用their替換了。regsub命令也有幾個(gè)開(kāi)關(guān)(switchs):-nocase意義同regexp命令中。-all沒(méi)有這個(gè)開(kāi)關(guān)時(shí),regsub只替換第一個(gè)匹配,有了這個(gè)開(kāi)關(guān),regsub將把所有匹配的地方全部替換。-意義同regexp命令中。string命令string命令的語(yǔ)法

49、:stringoptionarg?arg.?string命令具有強(qiáng)大的操作字符串的功能,其中的option選項(xiàng)多達(dá)20個(gè)。下面介紹其中常用的部分。stringcompare?-nocase?-lengthint?string1string2把字符串string1和string2進(jìn)行比較,返回值為-1、0或1,分別對(duì)應(yīng)string1小于、等于或大于string2。如果有-length參數(shù),那么只比較前int個(gè)字符,如果int為負(fù)數(shù),那么這個(gè)參數(shù)被忽略。如果有-nocase參數(shù),那么比較時(shí)不區(qū)分大小寫。stringequal?-nocase?-lengthint?string1string2把字符

50、串string1和string2進(jìn)行比較,如果兩者相同,返回值為1,否則返回0。其他參數(shù)與8.5.1同。stringfirststring1string2?startindex?在string2中從頭查找與string1匹配的字符序列,如果找到,那么就返回匹配的第一個(gè)字母所在的位置(0-based)。如果沒(méi)有找到,那么返回-1。如果給出了startindex變量,那么將從startindex處開(kāi)始查找。例如:%stringfirstabdefabc3%stringfirstabdefabc4-1stringindexstringcharIndex返回string中第charIndex個(gè)字符(0

51、-based)。charIndex可以是下面的值:整數(shù)n:字符串中第n個(gè)字符(0-based)end:最后一個(gè)字符end整數(shù)n:倒數(shù)第n個(gè)字符。stringindexabcdend-1返回字符c如果charIndex小于0,或者大于字符串string的長(zhǎng)度,那么返回空。例如:%stringindexabcdef2c%stringindexabcdefend-2dstringlaststring1string2?startindex?參照8.5.3.唯一的區(qū)別是從后往前查找stringlengthstring返回字符串string的長(zhǎng)度.stringmatch?-nocase?patternst

52、ring如果pattern匹配string,那么返回1,否則返回0.如果有-nocase參數(shù),那么就不區(qū)分大小寫.在pattern中可以使用通配符:*匹配string中的任意長(zhǎng)的任意字符串,包括空字符串.?匹配string中任意單個(gè)字符chars匹配字符集合chars中給出的任意字符,其中可以使用A-Z這種形式x匹配單個(gè)字符x,使用是為了讓x可以為字符*,-,.例子:%stringmatch*abcdef1%stringmatcha*abcdef1stringmatcha?cdefabcdef1%stringmatchab-fcdefabcdef/注意一定藥用,否則TCL解釋器會(huì)把b-f當(dāng)作命

53、令名1/從而導(dǎo)致錯(cuò)誤%stringmatchab-fcdefaccdef1stringrangestringfirstlast返回字符串string中從第first個(gè)到第last個(gè)字符的子字符串(0-based)。如果first0,那么first被看作0,如果last大于或等于字符串的長(zhǎng)度,那么last被看作end,如果first比last大,那么返回空。stringrepeatstringcount返回值為:重復(fù)了string字符串count次的字符串。例如:%stringrepeatabc2abcabcstringreplacestringfirstlast?newstring?返回值為:

54、從字符串string中刪除了第first到第last個(gè)字符(0-based)的字符串,如果給出了newstring變量,那么就用newstring替換從第first到第last個(gè)字符。如果firstdefstringtrimleftstring?chars?同8.5.13。不過(guò)只刪除左邊的字符。stringtrimrightstring?chars?同8.5.13。不過(guò)只刪除右邊的字符。文件訪問(wèn)TCL提供了豐富的文件操作的命令。通過(guò)這些命令你可以對(duì)文件名進(jìn)行操作(查找匹配某一模式的文件)、以順序或隨機(jī)方式讀寫文件、檢索系統(tǒng)保留的文件信息(如最后訪問(wèn)時(shí)間)。文件名TCL中文件名和我們熟悉的win

55、dows表示文件的方法有一些區(qū)別:在表示文件的目錄結(jié)構(gòu)時(shí)它使用/,而不是,這和TCL最初是在UNIX下實(shí)現(xiàn)有關(guān)。比如C盤tcl目錄下的文件sample.tcl在TCL中這樣表示:C:/tcl/sample.tcl?;疚募斎胼敵雒钸@個(gè)名為tgrep的過(guò)程,可以說(shuō)明TCL文件I/O的基本特點(diǎn):proctgreppatternfilenamesetfopen$filenamerwhilegets$flineifregexp$pattern$lineputsstdout$lineclose$f以上過(guò)程非常象UNIX的grep命令,你可以用兩個(gè)參數(shù)調(diào)用它,一個(gè)是模式,另一個(gè)是文件名,tgrep將打

56、印出文件中所有匹配該模式的行。下面介紹上述過(guò)程中用到的幾個(gè)基本的文件輸入輸出命令。openname?access?open命令以access方式打開(kāi)文件name。返回供其他命令(gets,close等)使用的文件標(biāo)識(shí)。如果name的第一個(gè)字符是“|”,管道命令被觸發(fā),而不是打開(kāi)文件。文件的打開(kāi)方式和我們熟悉的C語(yǔ)言類似,有以下方式:r只讀方式打開(kāi)。文件必須已經(jīng)存在。這是默認(rèn)方式。r+讀寫方式打開(kāi),文件必須已經(jīng)存在。w只寫方式打開(kāi)文件,如果文件存在則清空文件內(nèi)容,否則創(chuàng)建一新的空文件。w+讀寫方式打開(kāi)文件,如文件存在則清空文件內(nèi)容,否則創(chuàng)建新的空文件。a只寫方式打開(kāi)文件,文件必須存在,并把指針指

57、向文件尾。a+讀寫方式打開(kāi)文件,并把指針指向文件尾。如文件不存在,創(chuàng)建新的空文件。open命令返回一個(gè)字符串用于表識(shí)打開(kāi)的文件。當(dāng)調(diào)用別的命令(如:gets,puts,close,對(duì)打開(kāi)的文件進(jìn)行操作時(shí),就可以使用這個(gè)文件標(biāo)識(shí)符。TCL有三個(gè)特定的文件標(biāo)識(shí):stdin,stdout和stderr,分別對(duì)應(yīng)標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯(cuò)誤通道,任何時(shí)候你都可以使用這三個(gè)文件標(biāo)識(shí)。getsfileId?varName?讀fileId標(biāo)識(shí)的文件的下一行,忽略換行符。如果命令中有varName就把該行賦給它,并返回該行的字符數(shù)(文件尾返回-1),如果沒(méi)有varName參數(shù),返回文件的下一行作為命令結(jié)果(如果到

58、了文件尾,就返回空字符串)。和gets類似的命令是read,不過(guò)read不是以行為單位的,它有兩種形式:read?-nonewline?fileId讀并返回fileId標(biāo)識(shí)的文件中所有剩下的字節(jié)。如果沒(méi)有nonewline開(kāi)關(guān),則在換行符處停止。readfileIdnumBytes在fileId標(biāo)識(shí)的文件中讀并返回下一個(gè)numbytes字節(jié)。puts?-nonewline?fileId?stringputs命令把string寫到fileId中,如果沒(méi)有nonewline開(kāi)關(guān)的話,添加換行符。fileId默認(rèn)是stdout。命令返回值為一空字符串。puts命令使用C的標(biāo)準(zhǔn)I/O庫(kù)的緩沖區(qū)方案,這

59、就意味著使用puts產(chǎn)生的信息不會(huì)立即出現(xiàn)在目標(biāo)文件中。如果你想使數(shù)據(jù)立即出現(xiàn)在文件中,那你就調(diào)用flush命令:flushfileId把緩沖區(qū)內(nèi)容寫到fileId標(biāo)識(shí)的文件中,命令返回值為空字符串。flush命令迫使緩沖區(qū)數(shù)據(jù)寫到文件中。flush直到數(shù)據(jù)被寫完才返回。當(dāng)文件關(guān)閉時(shí)緩沖區(qū)數(shù)據(jù)會(huì)自動(dòng)flush。close?fileId?關(guān)閉標(biāo)識(shí)為fileId的文件,命令返回值為一空字符串。這里特別說(shuō)明的一點(diǎn)是,TCL中對(duì)串口、管道、socket等的操作和對(duì)文件的操作類似,以上對(duì)文件的操作命令同樣適用于它們。隨機(jī)文件訪問(wèn)默認(rèn)文件輸入輸出方式是連續(xù)的:即每個(gè)gets或爎ead命令返回的是上次get

60、s或爎ead訪問(wèn)位置后面的字節(jié),每個(gè)puts命令寫數(shù)據(jù)是接著上次puts寫的位置接著寫。TCL提供了seek,tell和eof等命令使用戶可以非連續(xù)訪問(wèn)文件。每個(gè)打開(kāi)的打開(kāi)文件都有訪問(wèn)點(diǎn),即下次讀寫開(kāi)始的位置。文件打開(kāi)時(shí),訪問(wèn)點(diǎn)總是被設(shè)置為文件的開(kāi)頭或結(jié)尾,這取決于打開(kāi)文件時(shí)使用的訪問(wèn)模式。每次讀寫后訪問(wèn)位置按訪問(wèn)的字節(jié)數(shù)后移相應(yīng)的位數(shù)。可以使用seek命令來(lái)改變文件的訪問(wèn)點(diǎn):seekfileIdoffset?origin?把fileId標(biāo)識(shí)的文件的訪問(wèn)點(diǎn)設(shè)置為相對(duì)于origin偏移量為offset的位置。origin可以是start,current,end,默認(rèn)是start。命令的返回值是一

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論