




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、t c l用 法 祥 述一 tcl語法1 腳本、命令和單詞符號一個tcl腳本可以包含一個或多個命令。命令之間必須用換行符或分號隔開,下面的兩個腳本都是合法的: set a 1 set b 2 或 set a 1;set b 2 tcl的每一個命令包含一個或幾個單詞,第一個單詞代表命令名,另外的單詞則是這個命令的參數(shù),單詞之間必須用空格或tab鍵隔開。 tcl解釋器對一個命令的求值過程分為兩部分:分析和執(zhí)行。在分析階段,tcl 解釋器運(yùn)用規(guī)則把命令分成一個個獨(dú)立的單詞,同時進(jìn)行必要的置換(substitution); 在執(zhí)行階段,tcl 解釋器會把第一個單詞當(dāng)作命令名,并查看這個命令是否有定義,
2、如果有定義就激活這個命令對應(yīng)的c/c+過程,并把所有的單詞作為參數(shù)傳遞給該命令過程,讓命令過程進(jìn)行處理。 2 置換(substitution)注:在下面的所有章節(jié)的例子中,為tcl的命令提示符,輸入命令回車后,tcl會在接著的一行輸出命令執(zhí)行結(jié)果。/后面是我自己加上的說明,不是例子的一部分。 tcl解釋器在分析命令時,把所有的命令參數(shù)都當(dāng)作字符串看待,例如: %set x 10 /定義變量x,并把x的值賦為10 10 %set y x+100 /y的值是x+100,而不是我們期望的110 x+100 上例的第二個命令中,x被看作字符串x+100的一部分,如果我們想使用x的值10 ,就必須告訴t
3、cl解釋器:我們在這里期望的是變量x的值,而非字符x。怎么告訴tcl解釋器呢,這就要用到tcl語言中提供的置換功能。 tcl提供三種形式的置換:變量置換、命令置換和反斜杠置換。每種置換都會導(dǎo)致一個或多個單詞本身被其他的值所代替。置換可以發(fā)生在包括命令名在內(nèi)的每一個單詞中,而且置換可以嵌套。 1) 變量置換(variable subtitution)變量置換由一個符號標(biāo)記,變量置換會導(dǎo)致變量的值插入一個單詞中。例如: %set y $x+100 /y的值是10+100,這里x被置換成它的值10 10100 這時,y的值還不是我們想要的值110,而是10+100,因?yàn)閠cl解釋器把10+100看成
4、是一個字符串而不是表達(dá)式,y要想得到值110,還必須用命令置換,使得tcl會把10+100看成一個表達(dá)式并求值。2) 命令置換(command substitution)命令置換是由括起來的tcl命令及其參數(shù),命令置換會導(dǎo)致某一個命令的所有或部分單詞被另一個命令的結(jié)果所代替。例如: %set y expr $x+100 110 y的值是110,這里當(dāng)tcl解釋器遇到字符時,它就會把隨后的expr作為一個命令名,從而激活與expr對應(yīng)的c/c+過程,并把expr和變量置換后得到的10+110傳遞給該命令過程進(jìn)行處理。 如果在上例中我們?nèi)サ?,那么tcl會報(bào)錯。因?yàn)樵谡G闆r下,tcl解釋器只把命令
5、行中的第一個單詞作為看作命令,其他的單詞都作為普通字符串處理,看作是命令的參數(shù)。 注意,中必須是一個合法的tcl腳本,長度不限。中腳本的值為最后一個命令的返回值,例如: %set y expr $x+100;set b 300 /y的值為300,因?yàn)閟et b 300的返回值為300 300 有了命令置換,實(shí)際上就表示命令之間是可以嵌套的,即一個命令的結(jié)果可以作為別的命令的參數(shù)。3) 反斜杠置換(backslash substitution)tcl語言中的反斜杠置換類似于c語言中反斜杠的用法,主要用于在單詞符號中插入諸如換行符、空格、$等被tcl解釋器當(dāng)作特殊符號對待的字符。例如: set m
6、sg multiple space /msg的值為multiple space。 如果沒有的話,tcl會報(bào)錯,因?yàn)榻忉屍鲿堰@里最后兩個單詞之間的空格認(rèn)為是分隔符,于是發(fā)現(xiàn)set命令有多于兩個參數(shù),從而報(bào)錯。加入了后,空格不被當(dāng)作分隔符,multiple space被認(rèn)為是一個單詞(word)。又例如: %set msg money $3333 narray a2 /這個命令的執(zhí)行結(jié)果為:money $3333 array a2 這里的$不再被當(dāng)作變量置換符。 tcl支持以下的反斜杠置換: backslash sequence replaced by a audible alert (0x7)
7、 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 (one, two, or three ds) xhh hex value given by hh (any number of hs) newline space a single space character. 例如: set a x48 /對應(yīng) xhh h /十六進(jìn)制的48正好是72,對應(yīng)h set a 110
8、/對應(yīng) ddd h /八進(jìn)制的110正好是72,對應(yīng)h set a expr / 對應(yīng)newline space,一個命令可以用newline轉(zhuǎn)到下一行繼續(xù) 2+3 5 4) 雙引號和花括號 除了使用反斜杠外,tcl提供另外兩種方法來使得解釋器把分隔符和置換符等特殊字符當(dāng)作普通字符,而不作特殊處理,這就要使用雙引號和花括號()。 tcl解釋器對雙引號中的各種分隔符將不作處理,但是對換行符 及和兩種置換符會照常處理。例如: %set x 100 100 %set y $x ddd 100 ddd 而在花括號中,所有特殊字符都將成為普通字符,失去其特殊意義,tcl解釋器不會對其作特殊處理。 %se
9、t y /n$x expr 10+100 /n$x expr 10+100 3 注釋tcl中的注釋符是,和直到所在行結(jié)尾的所有字符都被tcl看作注釋,tcl解釋器對注釋將不作任何處理。不過,要注意的是,必須出現(xiàn)在tcl解釋器期望命令的第一個字符出現(xiàn)的地方,才被當(dāng)作注釋。 例如: %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 第二行中就不被當(dāng)作注釋符,因?yàn)樗霈F(xiàn)在命令的中間,tcl解釋
10、器把它和后面的字符當(dāng)作命令的參數(shù)處理,從而導(dǎo)致錯誤。而第四行的就被作為注釋,因?yàn)榍耙粋€命令已經(jīng)用一個分號結(jié)束,tcl解釋器期望下一個命令接著出現(xiàn)?,F(xiàn)在在這個位置出現(xiàn)#,隨后的字符就被當(dāng)作注釋了。二 變量1 簡單變量一個tcl的簡單變量包含兩個部分:名字和值。名字和值都可以是任意字符串。例如一個名為 “1323 7&*: hdgg的變量在tcl中都是合法的。不過為了更好的使用置換(substitution),變量名最好按cc+語言中標(biāo)識符的命名規(guī)則命名。 tcl解釋器在分析一個變量置換時,只把從符號往后直到第一個不是字母、數(shù)字或下劃線的字符之間的單詞符號作為要被置換的變量的名字。例如: % se
11、t a 2 2 set a.1 4 4 % set b $a.1 2.1 在最后一個命令行,我們希望把變量a.1的值付給b,但是tcl解釋器在分析時只把$符號之后直到第一個不是字母、數(shù)字或下劃線的字符(這里是.)之間的單詞符號(這里是a)當(dāng)作要被置換的變量的名字,所以tcl解釋器把a(bǔ)置換成2,然后把字符串“2.1”付給變量b。這顯然與我們的初衷不同。 當(dāng)然,如果變量名中有不是字母、數(shù)字或下劃線的字符,又要用置換,可以用花括號把變量名括起來。例如: %set b $a.1 4 tcl中的set命令能生成一個變量、也能讀取或改變一個變量的值。例如: set a kdfj kjdf kdfj kjd
12、f 如果變量a還沒有定義,這個命令將生成 變量a,并將其值置為kdfj kjdf,若a已定義,就簡單的把a(bǔ)的值置為kdfj kjdf。 set a kdfj kjdf 這個只有一個參數(shù)的set命令讀取a的當(dāng)前值kdfj kjdf。2 數(shù)組數(shù)組是一些元素的集合。tcl的數(shù)組和普通計(jì)算機(jī)語言中的數(shù)組有很大的區(qū)別。在tcl中,不能單獨(dú)聲明一個數(shù)組,數(shù)組只能和數(shù)組元素一起聲明。數(shù)組中,數(shù)組元素的名字包含兩部分:數(shù)組名和數(shù)組中元素的名字,tcl中數(shù)組元素的名字(下標(biāo)可以為任何字符串。例如: set day(monday) 1 set day(tuesday) 2 第一個命令生成一個名為day的數(shù)組,同時
13、在數(shù)組中生成一個名為monday的數(shù)組元素,并把值置為1,第二個命令生成一個名為tuesday的數(shù)組元素,并把值置為2。 簡單變量的置換已經(jīng)在前一節(jié)討論過,這里講一下數(shù)組元素的置換。除了有括號之外,數(shù)組元素的置換和簡單變量類似。例: set a monday set day(monday) 1 set b $day(monday) /b的值為1,即day(monday)的值。 set c $day($a) /c的值為1,即day(monday)的值。 tcl不能支持復(fù)雜的數(shù)據(jù)類型,這是一個很大的缺憾,也是tcl受指責(zé)很多的方面。但是tcl的一個擴(kuò)展itcl填補(bǔ)了這個缺憾 。3 相關(guān)命令set這
14、個命令在3.1已有詳細(xì)介紹。 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 element in array % puts $day(tuesday) 2 %unset day % puts $day(tuesday
15、) cant read day(tuesday): no such variable append和incr這兩個命令提供了改變變量的值的簡單手段。 append命令把文本加到一個變量的后面,例如: % set txt hello hello % append 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 三 表達(dá)式1 操作數(shù)tcl表達(dá)式的操
16、作數(shù)通常是整數(shù)或?qū)崝?shù)。整數(shù)一般是十進(jìn)制的, 但如果整數(shù)的第一個字符是0(zero),那么tcl將把這個整數(shù)看作八進(jìn)制的,如果前兩個字符是0x則這個整數(shù)被看作是十六進(jìn)制的。tcl的實(shí)數(shù)的寫法與ansi c中完全一樣。如: 2.1 7.9e+12 6e4 3. 2 運(yùn)算符和優(yōu)先級下面的表格中列出了tcl中用到的運(yùn)算符,它們的語法形式和用法跟ansi c中很相似。這里就不一一介紹。下表中的運(yùn)算符是按優(yōu)先級從高到低往下排列的。同一格中的運(yùn)算符優(yōu)先級相同。 語法形式結(jié)果操作數(shù)類型-a!aa負(fù)a非aint,floatint,floatinta*ba/ba%b乘除取模int,floatint,floatin
17、ta+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,float3 數(shù)學(xué)函數(shù)tcl支持常用的數(shù)學(xué)函數(shù),表達(dá)式中數(shù)學(xué)函數(shù)的寫法類似于cc+語言的寫法,數(shù)學(xué)函數(shù)的參數(shù)可以是
18、任意表達(dá)式,多個參數(shù)之間用逗號隔開。例如: %set x 2 2 % expr 2* sin($x0 . elseif $x1 . elseif $x2 . else . 注意,上例中一定要寫在上一行,因?yàn)槿绻贿@樣,tcl 解釋器會認(rèn)為if命令在換行符處已結(jié)束,下一行會被當(dāng)成新的命令,從而導(dǎo)致錯誤的結(jié)果。在下面的循環(huán)命令的書寫中也要注意這個問題。書寫中還要注意的一個問題是if 和之間應(yīng)該有一個空格,否則tcl解釋器會把if作為一個整體當(dāng)作一個命令名,從而導(dǎo)致錯誤。2 循環(huán)命令循環(huán)命令包括while、for、foreach等。while命令語法為: while test body 參數(shù)test
19、是一個表達(dá)式,body是一個腳本,如果表達(dá)式的值非0,就運(yùn)行腳本,直到表達(dá)式為0才停止循環(huán),此時while命令中斷并返回一個空字符串。 例如: 假設(shè)變量 a 是一個鏈表,下面的腳本把a(bǔ) 的值復(fù)制到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是一個初始化腳本,第二個參數(shù)test是一個表達(dá)式,用來決定循環(huán)什么時候中斷,第三個參數(shù)reinit是一個重新初始化的腳本,第四個參數(shù)body也是腳本,代表循環(huán)體。下
20、例與上例作用相同: 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 $a set b linsert $b 0 $i 2)、 foreach varlist1 list1 ?varlist2 l
21、ist2 .? 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 lappend x $i $j 這時總共有四次循環(huán),x的值為a d b e c f g。 set x fo
22、reach 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命令實(shí)現(xiàn)。只是書寫起來較為煩瑣。 switch命令的語法為: switch ? options? string pattern body ? pattern body .? 第一個是
23、可選參數(shù)options,表示進(jìn)行匹配的方式。tcl支持三種匹配方式:-exact方式,-glob方式,-regexp方式,缺省情況表示-glob方式。-exact方式表示的是精確匹配,-glob方式的匹配方式和string match 命令的匹配方式相同(第八節(jié)介紹),-regexp方式是正規(guī)表達(dá)式的匹配方式(第八節(jié)介紹)。第二個參數(shù)string 是要被用來作測試的值,第三個參數(shù)是括起來的一個或多個元素對,例: switch $x a - b incr t1 c incr t2 default incr t3 其中a的后面跟一個表示使用和下一個模式相同的腳本。default表示匹配任意值。一旦
24、switch命令 找到一個模式匹配,就執(zhí)行相應(yīng)的腳本,并返回腳本的值,作為switch命令的返回值。3 eval命令eval命令是一個用來構(gòu)造和執(zhí)行tcl腳本的命令,其語法為: eval arg ?arg .? 它可以接收一個或多個參數(shù),然后把所有的參數(shù)以空格隔開組合到一起成為一個腳本,然后對這個腳本進(jìn)行求值。例如: eval set a 2 ;set b 4 4 4 source命令source命令讀一個文件并把這個文件的內(nèi)容作為一個腳本進(jìn)行求值。例如: source e:/tcl&c/hello.tcl 注意路徑的描述應(yīng)該和unix相同,使用/而不是。六 過程(procedure)1過程定
25、義和返回值tcl支持過程的定義和調(diào)用,在tcl中,過程可以看作是用tcl腳本實(shí)現(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腳本,代表過程體。 proc生成一個新的命令,可以象固有命令一樣調(diào)用: % add 1 2 3 在定義過程時,你可以利用return命令在任何地方返回你想要的值。 return命令迅速
26、中斷過程,并把它的參數(shù)作為過程的結(jié)果。例如: % proc abs x if $x = 0 return $x return expr -$x 過程的返回值是過程體中最后執(zhí)行的那條命令的返回值。2 局部變量和全局變量對于在過程中定義的變量,因?yàn)樗鼈冎荒茉谶^程中被訪問,并且當(dāng)過程退出時會被自動刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。tcl中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內(nèi)部;全局變量的作用域則不包括所有過程的內(nèi)部。這一點(diǎn)和c語言有很大的不同. 如果我們想在過程內(nèi)部引用一個全局變量的值,可以使用global命令。例
27、如: % 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會出錯,因?yàn)樗徽J(rèn)識變量a。3 缺省參數(shù)和可變個數(shù)參數(shù)tcl還提供三種特殊的參數(shù)形式: 首先,你可以定義一個沒有參數(shù)的過程,例如: proc add expr 2+3 其次,可以定義具有缺省參數(shù)值的過程,我們可以為過程的部分或全部參數(shù)提供缺省值,如果調(diào)用過程時未提供那些參數(shù)的值,那么過程會自動使用缺省值賦給相應(yīng)的參數(shù)。和cc
28、+中具有缺省參數(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ù),如果過程的最后一個參數(shù)是args, 那么就表示這個過程支持可變個數(shù)的參數(shù)調(diào)用。調(diào)用時,位于args以前的參數(shù)象普通參數(shù)一樣處理,但任何附加的參數(shù)都需要在過程體中作特殊處理,過程的局部變量args將會被設(shè)置為一個列表,其
29、元素就是所有附加的變量。如果沒有附加的變量,args就設(shè)置成一個空串,下面是一個例子: 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 4 引用:upvar命令語法:upvar ?level? othervar myvar ?othervar myvar .? upvar命令使得用戶可以在過程中對全局變量或其他過程中的局部變量進(jìn)行訪問。 upvar命令的第一個參數(shù)othervar是我們希望以引用方式訪問的參數(shù)的名字,第二個參數(shù)my
30、var 是這個過程中的局部變量的名字,一旦使用了upvar 命令把othervar 和myvar 綁定,那么在過程中對局部變量myvar 的讀寫就相當(dāng)于對這個過程的調(diào)用者中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(實(shí)際上是過程myexp中的變量a)和過程temp中的變量b綁定,對b的讀寫就相當(dāng)于對a的讀寫。 upvar
31、命令語法中的level參數(shù)表示:調(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。 七 字符串操作1 forma
32、t命令因?yàn)閠cl把所有的輸入都當(dāng)作字符串看待,所以tcl提供了較強(qiáng)的字符串操作功能,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 john john %set age 20 20 %set msg
33、format %s is %d years old $name $age john is 20 years old 2 scan命令語法:scan string format varname ?varname .? scan命令可以認(rèn)為是format命令的逆,其功能類似于ansi c中的sscanf函數(shù)。它按format提供的格式分析string字符串,然后把結(jié)果存到變量varname中,注意除了空格和tab鍵之外,string 和format中的字符和%必須匹配。例如: % scan some 26 34 some %d %d a b 2 % set a 26 % set b 34 % sc
34、an 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ù)。而且,我們發(fā)現(xiàn),如果變量varname不存在的話,tcl會自動聲明該變量。 3 regexp命令語法:regexp ?switchs? ?-? exp string ?matchvar? ?submatchvar submatchvar.? regex
35、p命令用于判斷正規(guī)表達(dá)式exp是否全部或部分匹配字符串string,匹配返回1,否則0。 在正規(guī)表達(dá)式中,一些字符具有特殊的含義,下表一一列出,并給予了解釋。 字符意義.匹配任意單個字符表示從頭進(jìn)行匹配$表示從末尾進(jìn)行匹配x匹配字符x,這可以抑制字符x的含義chars匹配字符集合chars中給出的任意字符,如果chars中的第一個字符是,表示匹配任意不在chars中的字符,chars的表示方法支持a-z之類的表示。(regexp)把regexp作為一個單項(xiàng)進(jìn)行匹配*對*前面的項(xiàng)0進(jìn)行次或多次匹配+對前面的項(xiàng)進(jìn)行1次或多次匹配?對?前面的項(xiàng)進(jìn)行0次或1次匹配regexp1|regexp2匹配re
36、gexp1或regexp2中的一項(xiàng)下面的一個例子是從tcl and tk toolkit中摘下來的,下面進(jìn)行說明: “n*n” 匹配所有到換行符為止的內(nèi)容。(0x)?0-9a-fa-f+|0-9+)$ 這個正規(guī)表達(dá)式匹配任何十六進(jìn)制或十進(jìn)制的整數(shù)。 兩個正規(guī)表達(dá)式以|分開(0x)?0-9a-fa-f+和0-9+,表示可以匹配其中的任何一個,事實(shí)上前者匹配十六進(jìn)制,后者匹配的十進(jìn)制。 表示必須從頭進(jìn)行匹配,從而上述正規(guī)表達(dá)式不匹配jk12之類不是以0x或數(shù)字開頭的串。 表示必須從末尾開始匹配,從而上述正規(guī)表達(dá)式不匹配12jk之類不是數(shù)字或a-fa-f結(jié)尾的串。 下面以(0x)?0-9a-fa-f
37、+ 進(jìn)行說明,(0x)表示0x一起作為一項(xiàng),?表示前一項(xiàng)(0x)可以出現(xiàn)0次或多次,0-9a-fa-f表示可以是任意0到9之間的單個數(shù)字或a到f或a到f之間的單個字母,表示象前面那樣的單個數(shù)字或字母可以重復(fù)出現(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和submatc
38、hvar,則所有的參數(shù)被當(dāng)作變量名,如果變量不存在,就會被生成。 regexp把匹配整個正規(guī)表達(dá)式的子字符串賦給第一個變量,匹配正規(guī)表達(dá)式的最左邊的子表達(dá)式的子字符串賦給第二個變量,依次類推,例如: % regexp (0-9+) *(a-z+) there is 100 apples total num word 1 % puts $total ,$num,$word 100 apples ,100,apples regexp可以設(shè)置一些開關(guān)(switchs,來控制匹配結(jié)果: 開關(guān)意義-nocase匹配時不考慮大小寫-indices改變各個變量的值,這使各個變量的值變成了對應(yīng)的匹配子串在整個
39、字符串中所處位置的索引。例如: % regexp -indices (0-9+) *(a-z+) there is 100 apples total num word 1 % puts $total ,$num,$word 9 20 ,10 12,15 20 正好子串“ 100 apples”的序號是9-20,100的序號是10-12,apples的序號是15-20 -about返回正則表達(dá)式本身的信息,而不是對緩沖區(qū)的解析。返回的是一個list,第一個元素是子表達(dá)式的個數(shù),第二個元素開始存放子表達(dá)式的信息-expanded啟用擴(kuò)展的規(guī)則,將空格和注釋忽略掉,相當(dāng)于使用內(nèi)嵌語法(?x)-lin
40、e啟用行敏感匹配。正常情況下和$只能匹配緩沖區(qū)起始和末尾,對于緩沖區(qū)內(nèi)部新的行是不能匹配的,通過這個開關(guān)可以使緩沖區(qū)內(nèi)部新的行也可以被匹配。它相當(dāng)于同時使用-linestop和-lineanchor開關(guān),或者使用內(nèi)嵌語法(?n)-linestop啟動行結(jié)束敏感開關(guān)。使可以匹配緩沖區(qū)內(nèi)部的新行。相當(dāng)于內(nèi)嵌語法(?p)-lineanchor改變和$的匹配行為,使可以匹配緩沖區(qū)內(nèi)部的新行。相當(dāng)于內(nèi)嵌語法(?w)-all進(jìn)最大可能的匹配-inlinecauses the command to return, as a list, the data that would otherwise be pla
41、ced in match variables. when using -inline, match variables may not be specified. if used with -all, the list will be concatenated at each iteration, such that a flat list is always returned. for each match iteration, the command will append the overall match data, plus one element for each subexpre
42、ssion in the regular expression. examples are: regexp -inline - w(w) inlined = in nregexp -all -inline - w(w) inlined = in n li i ne e-start index強(qiáng)制從偏移為index開始的位置進(jìn)行匹配。使用這個開關(guān)之后,將不能匹配行起始位置,a將匹配字符串的index偏移位置。如果使用了-indices開關(guān),則indices表示絕對位置,index表示輸入字符的相對位置。-表示這后面再沒有開關(guān)(switchs了,即使后面有以-開頭的參數(shù)也被當(dāng)作正規(guī)表達(dá)式的一部分。
43、 【tcl正則表達(dá)式規(guī)則詳細(xì)說明】description(描述)a regular expression describes strings of characters. its a pattern that matches certain strings and doesnt match others. different flavors of res(和標(biāo)準(zhǔn)正則表達(dá)式的區(qū)別)regular expressions, as defined by posix, come in two flavors: extended res and basic res. eres are roughly those of the traditional egrep, while bres are roughly those of the traditional ed. this imp
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZJBS 001-2024 城市公共標(biāo)識系統(tǒng)設(shè)計(jì)規(guī)范
- T-ZSA 230-2024 虛擬數(shù)字人多模態(tài)交互信息規(guī)范
- 二零二五年度荒山土地流轉(zhuǎn)與林業(yè)碳匯項(xiàng)目合作合同
- 二零二五年度企業(yè)合規(guī)管理體系法律服務(wù)合同范本
- 二零二五年度離婚協(xié)議書模板及婚姻關(guān)系終止及財(cái)產(chǎn)分配
- 二零二五年度診所醫(yī)療事故處理及責(zé)任劃分合同
- 二零二五年度養(yǎng)老護(hù)理型住宅正規(guī)房屋出租合同
- 二零二五年度混凝土班組勞務(wù)合作施工安全責(zé)任合同
- 二零二五年度銷售信息保密管理承諾書
- 2025年度耕地租賃與農(nóng)業(yè)科技推廣合同
- 兒童文學(xué)概論(譚旭東第二版) 課件全套 第1-5章 兒童文學(xué)的基本內(nèi)涵- 兒童文學(xué)的各種文體
- 學(xué)習(xí)新思想做好接班人演講稿(5篇)
- 【甲醇液相催化法生產(chǎn)一氯甲烷的工藝設(shè)計(jì)13000字(論文)】
- DB32T3916-2020建筑地基基礎(chǔ)檢測規(guī)程
- 高壓電工證題庫電工培訓(xùn)試題及答案
- 部編人教版六年級語文下冊全冊單元教材分析
- 新生兒單純皰疹病毒性腦炎的臨床診治要點(diǎn)詳解
- 5草船借箭 課件
- 鋅離子電池原理和應(yīng)用教學(xué)教案
- 2023廣東省深圳市各區(qū)中考數(shù)學(xué)模擬題-壓軸題
- 社區(qū)衛(wèi)生服務(wù)站設(shè)置基本標(biāo)準(zhǔn)
評論
0/150
提交評論