




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。Tcl用法詳述TCL用法祥述一TCL語法1腳本、命令和單詞符號一個(gè)TCL腳本可以包含一個(gè)或多個(gè)命令。命令之間必須用換行符或分號隔開,下面的兩個(gè)腳本都是合法的:seta1setb2或seta1;setb2TCL的每一個(gè)命令包含一個(gè)或幾個(gè)單詞,第一個(gè)單詞代表命令名,另外的單詞則是這個(gè)命令的參數(shù),單詞之間必須用空格或TAB鍵隔開。TCL解釋器對一個(gè)命令的求值過程分為兩部分:分析和執(zhí)行。在分析階段,TCL解釋器運(yùn)用規(guī)則把命令分成一個(gè)個(gè)獨(dú)立的單詞,同時(shí)進(jìn)行必要的置換(substitution);在執(zhí)行階段,TCL
2、解釋器會把第一個(gè)單詞當(dāng)作命令名,并查看這個(gè)命令是否有定義,如果有定義就激活這個(gè)命令對應(yīng)的C/C+過程,并把所有的單詞作為參數(shù)傳遞給該命令過程,讓命令過程進(jìn)行處理。2置換(substitution)注:在下面的所有章節(jié)的例子中,為TCL的命令提示符,輸入命令回車后,TCL會在接著的一行輸出命令執(zhí)行結(jié)果。/后面是我自己加上的說明,不是例子的一部分。TCL解釋器在分析命令時(shí),把所有的命令參數(shù)都當(dāng)作字符串看待,例如:%setx10/定義變量x,并把x的值賦為1010%setyx+100/y的值是x+100,而不是我們期望的110 x+100上例的第二個(gè)命令中,x被看作字符串x+100的一部分,如果我們
3、想使用x的值10,就必須告訴TCL解釋器:我們在這里期望的是變量x的值,而非字符x。怎么告訴TCL解釋器呢,這就要用到TCL語言中提供的置換功能。TCL提供三種形式的置換:變量置換、命令置換和反斜杠置換。每種置換都會導(dǎo)致一個(gè)或多個(gè)單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內(nèi)的每一個(gè)單詞中,而且置換可以嵌套。1)變量置換(variablesubtitution)變量置換由一個(gè)符號標(biāo)記,變量置換會導(dǎo)致變量的值插入一個(gè)單詞中。例如:%sety$x+100/y的值是10+100,這里x被置換成它的值1010100這時(shí),y的值還不是我們想要的值110,而是10+100,因?yàn)門CL解釋器把10+
4、100看成是一個(gè)字符串而不是表達(dá)式,y要想得到值110,還必須用命令置換,使得TCL會把10+100看成一個(gè)表達(dá)式并求值。2)命令置換(commandsubstitution)命令置換是由括起來的TCL命令及其參數(shù),命令置換會導(dǎo)致某一個(gè)命令的所有或部分單詞被另一個(gè)命令的結(jié)果所代替。例如:%setyexpr$x+100110y的值是110,這里當(dāng)TCL解釋器遇到字符時(shí),它就會把隨后的expr作為一個(gè)命令名,從而激活與expr對應(yīng)的C/C+過程,并把expr和變量置換后得到的10+110傳遞給該命令過程進(jìn)行處理。如果在上例中我們?nèi)サ簦敲碩CL會報(bào)錯(cuò)。因?yàn)樵谡G闆r下,TCL解釋器只把命令行中的第
5、一個(gè)單詞作為看作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。注意,中必須是一個(gè)合法的TCL腳本,長度不限。中腳本的值為最后一個(gè)命令的返回值,例如:%setyexpr$x+100;setb300/y的值為300,因?yàn)閟etb300的返回值為300300有了命令置換,實(shí)際上就表示命令之間是可以嵌套的,即一個(gè)命令的結(jié)果可以作為別的命令的參數(shù)。3)反斜杠置換(backslashsubstitution)TCL語言中的反斜杠置換類似于C語言中反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、$等被TCL解釋器當(dāng)作特殊符號對待的字符。例如:setmsgmultiplespace/msg的
6、值為multiplespace。如果沒有的話,TCL會報(bào)錯(cuò),因?yàn)榻忉屍鲿堰@里最后兩個(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)
7、rCarriagereturn(0 xd)tTab(0 x9)vVerticaltab(0 xb)dddOctalvaluegivenbyddd(one,two,orthreeds)xhhHexvaluegivenbyhh(anynumberofhs)newlinespaceAsinglespacecharacter.例如:setax48/對應(yīng)xhhH/十六進(jìn)制的48正好是72,對應(yīng)Hseta110/對應(yīng)dddH/八進(jìn)制的110正好是72,對應(yīng)Hsetaexpr/對應(yīng)newlinespace,一個(gè)命令可以用newline轉(zhuǎn)到下一行繼續(xù)2+354)雙引號和花括號除了使用反斜杠外,TCL提供另外兩
8、種方法來使得解釋器把分隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號和花括號()。TCL解釋器對雙引號中的各種分隔符將不作處理,但是對換行符及和兩種置換符會照常處理。例如:%setx100100%sety$xddd100ddd而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,TCL解釋器不會對其作特殊處理。%sety/n$xexpr10+100/n$xexpr10+1003注釋TCL中的注釋符是,和直到所在行結(jié)尾的所有字符都被TCL看作注釋,TCL解釋器對注釋將不作任何處理。不過,要注意的是,必須出現(xiàn)在TCL解釋器期望命令的第一個(gè)字符出現(xiàn)的地方,才被當(dāng)作注釋。例
9、如:%Thisisacomment%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è)分號結(jié)束,TCL解釋器期望下一個(gè)命令接著出現(xiàn)。現(xiàn)在在這個(gè)位置出現(xiàn)#,隨后的字符就被當(dāng)作注釋了。二變量1簡單變量一個(gè)TCL的簡單變量包含兩個(gè)部分:名字和值。名字和值都可以是任意字符串。例如一個(gè)名為“13237&*:hdgg的變量在TCL
10、中都是合法的。不過為了更好的使用置換(substitution),變量名最好按CC+語言中標(biāo)識符的命名規(guī)則命名。TCL解釋器在分析一個(gè)變量置換時(shí),只把從符號往后直到第一個(gè)不是字母、數(shù)字或下劃線的字符之間的單詞符號作為要被置換的變量的名字。例如:%seta22seta.144%setb$a.12.1在最后一個(gè)命令行,我們希望把變量a.1的值付給b,但是TCL解釋器在分析時(shí)只把$符號之后直到第一個(gè)不是字母、數(shù)字或下劃線的字符(這里是.)之間的單詞符號(這里是a)當(dāng)作要被置換的變量的名字,所以TCL解釋器把a(bǔ)置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。當(dāng)然,如果變量名中有不是
11、字母、數(shù)字或下劃線的字符,又要用置換,可以用花括號把變量名括起來。例如:%setb$a.14TCL中的set命令能生成一個(gè)變量、也能讀取或改變一個(gè)變量的值。例如:setakdfjkjdfkdfjkjdf如果變量a還沒有定義,這個(gè)命令將生成變量a,并將其值置為kdfjkjdf,若a已定義,就簡單的把a(bǔ)的值置為kdfjkjdf。setakdfjkjdf這個(gè)只有一個(gè)參數(shù)的set命令讀取a的當(dāng)前值kdfjkjdf。2數(shù)組數(shù)組是一些元素的集合。TCL的數(shù)組和普通計(jì)算機(jī)語言中的數(shù)組有很大的區(qū)別。在TCL中,不能單獨(dú)聲明一個(gè)數(shù)組,數(shù)組只能和數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組名和數(shù)組中元
12、素的名字,TCL中數(shù)組元素的名字(下標(biāo)可以為任何字符串。例如:setday(monday)1setday(tuesday)2第一個(gè)命令生成一個(gè)名為day的數(shù)組,同時(shí)在數(shù)組中生成一個(gè)名為monday的數(shù)組元素,并把值置為1,第二個(gè)命令生成一個(gè)名為tuesday的數(shù)組元素,并把值置為2。簡單變量的置換已經(jīng)在前一節(jié)討論過,這里講一下數(shù)組元素的置換。除了有括號之外,數(shù)組元素的置換和簡單變量類似。例:setamondaysetday(monday)1setb$day(monday)/b的值為1,即day(monday)的值。setc$day($a)/c的值為1,即day(monday)的值。TCL不能支
13、持復(fù)雜的數(shù)據(jù)類型,這是一個(gè)很大的缺憾,也是TCL受指責(zé)很多的方面。但是TCL的一個(gè)擴(kuò)展ITCL填補(bǔ)了這個(gè)缺憾。3相關(guān)命令set這個(gè)命令在3.1已有詳細(xì)介紹。unset這個(gè)命令從解釋器中刪除變量,它后面可以有任意多個(gè)參數(shù),每個(gè)參數(shù)是一個(gè)變量名,可以是簡單變量,也可以是數(shù)組或數(shù)組元素。例如:%unsetabday(monday)上面的語句中刪除了變量a、b和數(shù)組元素day(monday),但是數(shù)組day并沒有刪除,其他元素還存在,要?jiǎng)h除整個(gè)數(shù)組,只需給出數(shù)組的名字。例如:%puts$day(monday)cantreadday(monday):nosuchelementinarray%puts$d
14、ay(tuesday)2%unsetday%puts$day(tuesday)cantreadday(tuesday):nosuchvariableappend和incr這兩個(gè)命令提供了改變變量的值的簡單手段。append命令把文本加到一個(gè)變量的后面,例如:%settxthellohello%appendtxt!Howareyouhello!Howareyouincr命令把一個(gè)變量值加上一個(gè)整數(shù)。incr要求變量原來的值和新加的值都必須是整數(shù)。%setbaa%incrbexpectedintegerbutgota%setb22%incrb35三表達(dá)式1操作數(shù)TCL表達(dá)式的操作數(shù)通常是整數(shù)或?qū)崝?shù)
15、。整數(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.2運(yùn)算符和優(yōu)先級下面的表格中列出了TCL中用到的運(yùn)算符,它們的語法形式和用法跟ANSIC中很相似。這里就不一一介紹。下表中的運(yùn)算符是按優(yōu)先級從高到低往下排列的。同一格中的運(yùn)算符優(yōu)先級相同。語法形式結(jié)果操作數(shù)類型-a!aa負(fù)a非aint,floatint,floatinta*ba/ba%b乘除取模int,floatint,floatinta+ba-b加減int,floati
16、nt,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,float3數(shù)學(xué)函數(shù)TCL支持常用的數(shù)學(xué)函數(shù),表達(dá)式中數(shù)學(xué)函數(shù)的寫法類似于CC+語言的寫法,數(shù)學(xué)函數(shù)的參數(shù)可以是任意表達(dá)式,多個(gè)參數(shù)之間用逗號隔開。例如:%
17、setx22%expr2*sin($x0elseif$x1elseif$x2else注意,上例中一定要寫在上一行,因?yàn)槿绻贿@樣,TCL解釋器會認(rèn)為if命令在換行符處已結(jié)束,下一行會被當(dāng)成新的命令,從而導(dǎo)致錯(cuò)誤的結(jié)果。在下面的循環(huán)命令的書寫中也要注意這個(gè)問題。書寫中還要注意的一個(gè)問題是if和之間應(yīng)該有一個(gè)空格,否則TCL解釋器會把if作為一個(gè)整體當(dāng)作一個(gè)命令名,從而導(dǎo)致錯(cuò)誤。2循環(huán)命令循環(huán)命令包括while、for、foreach等。while命令語法為:whiletestbody參數(shù)test是一個(gè)表達(dá)式,body是一個(gè)腳本,如果表達(dá)式的值非0,就運(yùn)行腳本,直到表達(dá)式為0才停止循環(huán),此時(shí)whi
18、le命令中斷并返回一個(gè)空字符串。例如:假設(shè)變量a是一個(gè)鏈表,下面的腳本把a(bǔ)的值復(fù)制到b:setbsetiexprllength$a-1while$i=0lappendblindex$a$iincri-1for命令語法為:forinittestreinitbody參數(shù)init是一個(gè)初始化腳本,第二個(gè)參數(shù)test是一個(gè)表達(dá)式,用來決定循環(huán)什么時(shí)候中斷,第三個(gè)參數(shù)reinit是一個(gè)重新初始化的腳本,第四個(gè)參數(shù)body也是腳本,代表循環(huán)體。下例與上例作用相同:setbforsetiexprllength$a-1$i=0incri-1lappendblindex$a$iforeach命令這個(gè)命令有兩種語
19、法形式1)、foreachvarNamelistbody第一個(gè)參數(shù)varName是一個(gè)變量,第二個(gè)參數(shù)list是一個(gè)表(有序集合),第三個(gè)參數(shù)body是循環(huán)體。每次取得鏈表的一個(gè)元素,都會執(zhí)行循環(huán)體一次。下例與上例作用相同:setbforeachi$asetblinsert$b0$i2)、foreachvarlist1list1?varlist2list2.?Body這種形式包含了第一種形式。第一個(gè)參數(shù)varlist1是一個(gè)循環(huán)變量列表,第二個(gè)參數(shù)是一個(gè)列表list1,varlist1中的變量會分別取list1中的值。body參數(shù)是循環(huán)體。?varlist2list2.?表示可以有多個(gè)變量列表
20、和列表對出現(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)過程,并從循環(huán)中跳出,continue只是結(jié)束本次循環(huán)。switch命令和C語言中switch語句一樣,TCL中的switch命令也
21、可以由if命令實(shí)現(xiàn)。只是書寫起來較為煩瑣。switch命令的語法為: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是要被用來作測試的值,第三個(gè)參數(shù)是括起來的一個(gè)或多個(gè)元素對,例:switch$xa-bi
22、ncrt1cincrt2defaultincrt3其中a的后面跟一個(gè)表示使用和下一個(gè)模式相同的腳本。default表示匹配任意值。一旦switch命令找到一個(gè)模式匹配,就執(zhí)行相應(yīng)的腳本,并返回腳本的值,作為switch命令的返回值。3eval命令eval命令是一個(gè)用來構(gòu)造和執(zhí)行TCL腳本的命令,其語法為:evalarg?arg.?它可以接收一個(gè)或多個(gè)參數(shù),然后把所有的參數(shù)以空格隔開組合到一起成為一個(gè)腳本,然后對這個(gè)腳本進(jìn)行求值。例如:evalseta2;setb444source命令source命令讀一個(gè)文件并把這個(gè)文件的內(nèi)容作為一個(gè)腳本進(jìn)行求值。例如:sourcee:/tcl&c/hello
23、.tcl注意路徑的描述應(yīng)該和UNIX相同,使用/而不是。六過程(procedure)1過程定義和返回值TCL支持過程的定義和調(diào)用,在TCL中,過程可以看作是用TCL腳本實(shí)現(xiàn)的命令,效果與TCL的固有命令相似。我們可以在任何時(shí)候使用proc命令定義自己的過程,TCL中的過程類似于C中的函數(shù)。TCL中過程是由proc命令產(chǎn)生的:例如:%procaddxyexpr$x+$yproc命令的第一個(gè)參數(shù)是你要定義的過程的名字,第二個(gè)參數(shù)是過程的參數(shù)列表,參數(shù)之間用空格隔開,第三個(gè)參數(shù)是一個(gè)TCL腳本,代表過程體。proc生成一個(gè)新的命令,可以象固有命令一樣調(diào)用:%add123在定義過程時(shí),你可以利用ret
24、urn命令在任何地方返回你想要的值。return命令迅速中斷過程,并把它的參數(shù)作為過程的結(jié)果。例如:%procabsxif$x=0return$xreturnexpr-$x過程的返回值是過程體中最后執(zhí)行的那條命令的返回值。2局部變量和全局變量對于在過程中定義的變量,因?yàn)樗鼈冎荒茉谶^程中被訪問,并且當(dāng)過程退出時(shí)會被自動(dòng)刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內(nèi)部;全局變量的作用域則不包括所有過程的內(nèi)部。這一點(diǎn)和C語言有很大的不同.如果我們想在過程內(nèi)部引用一個(gè)全局變量的值,可以
25、使用global命令。例如:%seta44%procsamplexglobalaincrareturnexpr$a+$x%sample38%seta5全局變量a在過程中被訪問。在過程中對a的改變會直接反映到全局上。如果去掉語句globala,TCL會出錯(cuò),因?yàn)樗徽J(rèn)識變量a。3缺省參數(shù)和可變個(gè)數(shù)參數(shù)TCL還提供三種特殊的參數(shù)形式:首先,你可以定義一個(gè)沒有參數(shù)的過程,例如:procaddexpr2+3其次,可以定義具有缺省參數(shù)值的過程,我們可以為過程的部分或全部參數(shù)提供缺省值,如果調(diào)用過程時(shí)未提供那些參數(shù)的值,那么過程會自動(dòng)使用缺省值賦給相應(yīng)的參數(shù)。和CC+中具有缺省參數(shù)值的函數(shù)一樣,有缺省值的
26、參數(shù)只能位于參數(shù)列表的后部,即在第一個(gè)具有缺省值的參數(shù)后面的所有參數(shù),都只能是具有缺省值的參數(shù)。例如:procaddval1val22val33expr$val1+$val2+$val3則:add1/值為6add220/值為25add456/值為15另外,TCL的過程定義還支持可變個(gè)數(shù)的參數(shù),如果過程的最后一個(gè)參數(shù)是args,那么就表示這個(gè)過程支持可變個(gè)數(shù)的參數(shù)調(diào)用。調(diào)用時(shí),位于args以前的參數(shù)象普通參數(shù)一樣處理,但任何附加的參數(shù)都需要在過程體中作特殊處理,過程的局部變量args將會被設(shè)置為一個(gè)列表,其元素就是所有附加的變量。如果沒有附加的變量,args就設(shè)置成一個(gè)空串,下面是一個(gè)例子:pr
27、ocaddval1argssetsum$val1foreachi$argsincrsum$ireturn$sum則:add2/值為2add23456/值為204引用:upvar命令語法:upvar?level?otherVarmyVar?otherVarmyVar.?upvar命令使得用戶可以在過程中對全局變量或其他過程中的局部變量進(jìn)行訪問。upvar命令的第一個(gè)參數(shù)otherVar是我們希望以引用方式訪問的參數(shù)的名字,第二個(gè)參數(shù)myVar是這個(gè)過程中的局部變量的名字,一旦使用了upvar命令把otherVar和myVar綁定,那么在過程中對局部變量myVar的讀寫就相當(dāng)于對這個(gè)過程的調(diào)用者中
28、otherVar所代表的局部變量的讀寫。下面是一個(gè)例子:%proctempargupvar$argbsetbexpr$b+2%procmyexpvarseta4tempareturnexpr$var+$a則:%myexp713這個(gè)例子中,upvar把$arg(實(shí)際上是過程myexp中的變量a)和過程temp中的變量b綁定,對b的讀寫就相當(dāng)于對a的讀寫。upvar命令語法中的level參數(shù)表示:調(diào)用upvar命令的過程相對于我們希望引用的變量myVar在調(diào)用棧中相對位置。例如:upvar2otherx這個(gè)命令使得當(dāng)前過程的調(diào)用者的調(diào)用者中的變量other,可以在當(dāng)前過程中利用x訪問。缺省情況下,
29、level的值為1,即當(dāng)前過程(上例中的temp)的調(diào)用者(上例中的myexp)中的變量(上例中myexp的a)可以在當(dāng)前過程中利用局部變量(上例中temp的b)訪問。如果要訪問全局變量可以這樣寫:upvar0otherx那么,不管當(dāng)前過程處于調(diào)用棧中的什么位置,都可以在當(dāng)前過程中利用x訪問全局變量other。七字符串操作1format命令因?yàn)門CL把所有的輸入都當(dāng)作字符串看待,所以TCL提供了較強(qiáng)的字符串操作功能,TCL中與字符串操作有關(guān)的命令有:string、format、regexp、regsub、scan等。format命令語法:formatformatstring?vluevalue
30、.?format命令類似于ANSIC中的sprintf函數(shù)和MFC中CString類提供的Format成員函數(shù)。它按formatstring提供的格式,把各個(gè)value的值組合到formatstring中形成一個(gè)新字符串,并返回。例如:%setnamejohnJohn%setage2020%setmsgformat%sis%dyearsold$name$agejohnis20yearsold2scan命令語法:scanstringformatvarName?varName.?scan命令可以認(rèn)為是format命令的逆,其功能類似于ANSIC中的sscanf函數(shù)。它按format提供的格式分析s
31、tring字符串,然后把結(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會自動(dòng)聲明該變量。3regexp命令語法:regexp?switchs?-?ex
32、pstring?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)行匹配*對*前面的項(xiàng)進(jìn)行0次或多次匹配+對前面的項(xiàng)
33、進(jìn)行1次或多次匹配?對?前面的項(xiàng)進(jìn)行0次或1次匹配regexp1|regexp2匹配regexp1或regexp2中的一項(xiàng)下面的一個(gè)例子是從TclandTkToolKit中摘下來的,下面進(jìn)行說明:(0 x)?0-9a-fA-F+|0-9+)$這個(gè)正規(guī)表達(dá)式匹配任何十六進(jìn)制或十進(jìn)制的整數(shù)。兩個(gè)正規(guī)表達(dá)式以|分開(0 x)?0-9a-fA-F+和0-9+,表示可以匹配其中的任何一個(gè),事實(shí)上前者匹配十六進(jìn)制,后者匹配的十進(jìn)制。表示必須從頭進(jìn)行匹配,從而上述正規(guī)表達(dá)式不匹配jk12之類不是以0 x或數(shù)字開頭的串。表示必須從末尾開始匹配,從而上述正規(guī)表達(dá)式不匹配12jk之類不是數(shù)字或a-fA-F結(jié)尾的串
34、。下面以(0 x)?0-9a-fA-F+進(jìn)行說明,(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命令后面有參數(shù)matchVar和su
35、bMatchVar,則所有的參數(shù)被當(dāng)作變量名,如果變量不存在,就會被生成。regexp把匹配整個(gè)正規(guī)表達(dá)式的子字符串賦給第一個(gè)變量,匹配正規(guī)表達(dá)式的最左邊的子表達(dá)式的子字符串賦給第二個(gè)變量,依次類推,例如:%regexp(0-9+)*(a-z+)thereis100applestotalnumword1%puts$total,$num,$word100apples,100,applesregexp可以設(shè)置一些開關(guān)(switchs,來控制匹配結(jié)果:開關(guān)意義-nocase匹配時(shí)不考慮大小寫-indices改變各個(gè)變量的值,這使各個(gè)變量的值變成了對應(yīng)的匹配子串在整個(gè)字符串中所處位置的索引。例如:%r
36、egexp-indices(0-9+)*(a-z+)thereis100applestotalnumword1%puts$total,$num,$word920,1012,1520正好子串“100apples”的序號是9-20,100的序號是10-12,apples的序號是15-20-about返回正則表達(dá)式本身的信息,而不是對緩沖區(qū)的解析。返回的是一個(gè)list,第一個(gè)元素是子表達(dá)式的個(gè)數(shù),第二個(gè)元素開始存放子表達(dá)式的信息-expanded啟用擴(kuò)展的規(guī)則,將空格和注釋忽略掉,相當(dāng)于使用內(nèi)嵌語法(?x)-line啟用行敏感匹配。正常情況下和$只能匹配緩沖區(qū)起始和末尾,對于緩沖區(qū)內(nèi)部新的行是不能匹
37、配的,通過這個(gè)開關(guān)可以使緩沖區(qū)內(nèi)部新的行也可以被匹配。它相當(dāng)于同時(shí)使用-linestop和-lineanchor開關(guān),或者使用內(nèi)嵌語法(?n)-linestop啟動(dòng)行結(jié)束敏感開關(guān)。使可以匹配緩沖區(qū)內(nèi)部的新行。相當(dāng)于內(nèi)嵌語法(?p)-lineanchor改變和$的匹配行為,使可以匹配緩沖區(qū)內(nèi)部的新行。相當(dāng)于內(nèi)嵌語法(?w)-all進(jìn)最大可能的匹配-inlineCausesthecommandtoreturn,asalist,thedatathatwouldotherwisebeplacedinmatchvariables.Whenusing-inline,matchvariablesmaynot
38、bespecified.Ifusedwith-all,thelistwillbeconcatenatedateachiteration,suchthataflatlistisalwaysreturned.Foreachmatchiteration,thecommandwillappendtheoverallmatchdata,plusoneelementforeachsubexpressionintheregularexpression.Examplesare:regexp-inline-w(w)inlined=innregexp-all-inline-w(w)inlined=innliine
39、e-startindex強(qiáng)制從偏移為index開始的位置進(jìn)行匹配。使用這個(gè)開關(guān)之后,將不能匹配行起始位置,A將匹配字符串的index偏移位置。如果使用了-indices開關(guān),則indices表示絕對位置,index表示輸入字符的相對位置。-表示這后面再沒有開關(guān)(switchs了,即使后面有以-開頭的參數(shù)也被當(dāng)作正規(guī)表達(dá)式的一部分?!綯CL正則表達(dá)式規(guī)則詳細(xì)說明】DESCRIPTION(描述)Aregularexpressiondescribesstringsofcharacters.Itsapatternthatmatchescertainstringsanddoesntmatchothers
40、.DIFFERENTFLAVORSOFREs(和標(biāo)準(zhǔn)正則表達(dá)式的區(qū)別)Regularexpressions,asdefinedbyPOSIX,comeintwoflavors:extendedREsandbasicREs.EREsareroughlythoseofthetraditionalegrep,whileBREsareroughlythoseofthetraditionaled.Thisimplementationaddsathirdflavor,advancedREs,basicallyEREswithsomesignificantextensions.Thismanualpagep
41、rimarilydescribesAREs.BREsmostlyexistforbackwardcompatibilityinsomeoldprograms;theywillbediscussedattheend.POSIXEREsarealmostanexactsubsetofAREs.FeaturesofAREsthatarenotpresentinEREswillbeindicated.REGULAREXPRESSIONSYNTAX(語法)TclregularexpressionsareimplementedusingthepackagewrittenbyHenrySpencer,bas
42、edonthe1003.2specandsome(notquiteall)ofthePerl5extensions(thanks,Henry!).Muchofthedescriptionofregularexpressionsbelowiscopiedverbatimfromhismanualentry.AnAREisoneormorebranches,separatedby|,matchinganythingthatmatchesanyofthebranches.Abranchiszeroormoreconstraintsorquantifiedatoms,concatenated.Itma
43、tchesamatchforthefirst,followedbyamatchforthesecond,etc;anemptybranchmatchestheemptystring.Aquantifiedatomisanatompossiblyfollowedbyasinglequantifier.Withoutaquantifier,itmatchesamatchfortheatom.Thequantifiers,andwhataso-quantifiedatommatches,are:字符意義*asequenceof0ormorematchesoftheatom+asequenceof1o
44、rmorematchesoftheatom?asequenceof0or1matchesoftheatommasequenceofexactlymmatchesoftheatomm,asequenceofmormorematchesoftheatomm,nasequenceofmthroughn(inclusive)matchesoftheatom;mmaynotexceedn*?+?m?m,?m,n?non-greedyquantifiers,whichmatchthesamepossibilities,butpreferthesmallestnumberratherthanthelarge
45、stnumberofmatches(seeMATCHING)Theformsusingandareknownasbounds.Thenumbersmandnareunsigneddecimalintegerswithpermissiblevaluesfrom0to255inclusive.Anatomisoneof:字符意義(re)(wherereisanyregularexpression)matchesamatchforre,withthematchnotedforpossiblereporting(?:re)asprevious,butdoesnoreporting()matchesan
46、emptystring,notedforpossiblereporting(?:)matchesanemptystring,withoutreportingcharsabracketexpression,matchinganyoneofthechars(seeBRACKETEXPRESSIONSformoredetail).matchesanysinglecharacterkwherekisanon-alphanumericcharacter)matchesthatcharactertakenasanordinarycharacter,e.g.matchesabackslashcharacte
47、rcwherecisalphanumeric(possiblyfollowedbyothercharacters),anescape(AREsonly),seeESCAPESbelowwhenfollowedbyacharacterotherthanadigit,matchestheleft-bracecharacter;whenfollowedbyadigit,itisthebeginningofabound(seeabove)Xwherexisasinglecharacterwithnoothersignificance,matchesthatcharacter.Aconstraintma
48、tchesanemptystringwhenspecificconditionsaremet.Aconstraintmaynotbefollowedbyaquantifier.Thesimpleconstraintsareasfollows;somemoreconstraintsaredescribedlater,underESCAPES.字符意義matchesatthebeginningofaline$matchesattheendofaline(?=re)positivelookahead(AREsonly),matchesatanypointwhereasubstringmatching
49、rebegins(?!re)negativelookahead(AREsonly),matchesatanypointwherenosubstringmatchingrebeginsThelookaheadconstraintsmaynotcontainbackreferences(seelater),andallparentheseswithinthemareconsiderednon-capturing.AnREmaynotendwith.BRACKETEXPRESSIONS(預(yù)定義表達(dá)式)Abracketexpressionisalistofcharactersenclosedin.It
50、normallymatchesanysinglecharacterfromthelist(butseebelow).Ifthelistbeginswith,itmatchesanysinglecharacter(butseebelow)notfromtherestofthelist.Iftwocharactersinthelistareseparatedby-,thisisshorthandforthefullrangeofcharactersbetweenthosetwo(inclusive)inthecollatingsequence,e.g.0-9inASCIImatchesanydec
51、imaldigit.Tworangesmaynotshareanendpoint,soe.g.a-c-eisillegal.Rangesareverycollating-sequence-dependent,andportableprogramsshouldavoidrelyingonthem.Toincludealiteralor-inthelist,thesimplestmethodistoencloseitin.and.tomakeitacollatingelement(seebelow).Alternatively,makeitthefirstcharacter(followingap
52、ossible),or(AREsonly)precedeitwith.Alternatively,for-,makeitthelastcharacter,orthesecondendpointofarange.Tousealiteral-asthefirstendpointofarange,makeitacollatingelementor(AREsonly)precedeitwith.Withtheexceptionofthese,somecombinationsusing(seenextparagraphs),andescapes,allotherspecialcharacterslose
53、theirspecialsignificancewithinabracketexpression.Withinabracketexpression,acollatingelement(acharacter,amulti-charactersequencethatcollatesasifitwereasinglecharacter,oracollating-sequencenameforeither)enclosedin.and.standsforthesequenceofcharactersofthatcollatingelement.Thesequenceisasingleelementof
54、thebracketexpressionslist.Abracketexpressioninalocalethathasmulti-charactercollatingelementscanthusmatchmorethanonecharacter.So(insidiously),abracketexpressionthatstartswithcanmatchmulti-charactercollatingelementsevenifnoneofthemappearinthebracketexpression!(Note:Tclcurrentlyhasnomulti-charactercoll
55、atingelements.Thisinformationisonlyforillustration.)Forexample,assumethecollatingsequenceincludesachmulti-charactercollatingelement.ThentheRE.ch.*c(zeroormorechsfollowedbyc)matchesthefirstfivecharactersofchchcc.Also,theREcbmatchesallofchb(becausecmatchesthemulti-characterch).Withinabracketexpression
56、,acollatingelementenclosedin=and=isanequivalenceclass,standingforthesequencesofcharactersofallcollatingelementsequivalenttothatone,includingitself.(Iftherearenootherequivalentcollatingelements,thetreatmentisasiftheenclosingdelimiterswere.and.)Forexample,ifoand?arethemembersofanequivalenceclass,then=
57、o=,=?,andoareallsynonymous.Anequivalenceclassmaynotbeanendpointofarange.(Note:TclcurrentlyimplementsonlytheUnicodelocale.Itdoesntdefineanyequivalenceclasses.Theexamplesabovearejustillustrations.)Withinabracketexpression,thenameofacharacterclassenclosedin:and:standsforthelistofallcharacters(notallcol
58、latingelements!)belongingtothatclass.Standardcharacterclassesare:字符意義AlphaAletter.UpperAnupper-caseletter.LowerAlower-caseletter.DigitAdecimaldigit.XdigitAhexadecimaldigit.AlnumAnalphanumeric(letterordigit).PrintAnalphanumeric(sameasalnum).BlankAspaceortabcharacter.SpaceAcharacterproducingwhitespace
59、indisplayedtext.PunctApunctuationcharacter.GraphAcharacterwithavisiblerepresentation.CntrlAcontrolcharacter.Alocalemayprovideothers.(NotethatthecurrentTclimplementationhasonlyonelocale:theUnicodelocale.)Acharacterclassmaynotbeusedasanendpointofarange.Therearetwospecialcasesofbracketexpressions:thebr
60、acketexpressions:areconstraints,matchingemptystringsatthebeginningandendofawordrespectively.Awordisdefinedasasequenceofwordcharactersthatisneitherprecedednorfollowedbywordcharacters.Awordcharacterisanalnumcharacteroranunderscore(_).Thesespecialbracketexpressionsaredeprecated;usersofAREsshouldusecons
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度綜合性醫(yī)院消毒滅菌專業(yè)服務(wù)合同
- 2025年度農(nóng)業(yè)土地整治土地承包合同
- 2025年度抵押車個(gè)人車輛抵押權(quán)解除后續(xù)貸合同模板
- 寵物運(yùn)輸司機(jī)勞務(wù)協(xié)議
- 2025年廣東生態(tài)工程職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫必考題
- 2025年二手房市場分析:二手房市場降幅收窄
- 2024年三季度報(bào)重慶地區(qū)A股主營業(yè)務(wù)利潤排名前十大上市公司
- 2024-2025學(xué)年福建省福州市馬尾第一中學(xué)等六校高二上學(xué)期期中聯(lián)考生物試卷
- 2023-2024學(xué)年湖南省衡陽市祁東縣高考考前仿真聯(lián)考三生物試卷
- 意見征詢稿回復(fù)函
- 跨云平臺的DevOps集成
- 紡織染整行業(yè)安全培訓(xùn)
- 小學(xué)綜合實(shí)踐活動(dòng)《察探究活動(dòng)跟著節(jié)氣去探究》課教案
- 水工建筑物維護(hù)技術(shù)
- 載重汽車的安全操作規(guī)程范本
- 平臺對接技術(shù)方案
- 化妝品包裝相容性評估方法
- 安全生產(chǎn)法律法規(guī)、標(biāo)準(zhǔn)清單
- 消防車輛與泵裝備的配置與選用與更新的技術(shù)要求與管理辦法
- 學(xué)校重大事項(xiàng)議事決策制度
- 英納能特種防護(hù)材料珠海產(chǎn)研生態(tài)基地建設(shè)項(xiàng)目(一期)環(huán)境影響報(bào)告表
評論
0/150
提交評論