版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
EDA技術(shù)試驗(yàn)工具命令語言(TCL)
ToolCommandLanguage1/90主要內(nèi)容TCL介紹TCL語法TCL數(shù)據(jù)形態(tài)TCL結(jié)構(gòu)TCL過程2/90CompanyLogo一、TCL介紹概述
Tcl(稱為“工具命令語言”“ToolCommandLanguage”)是一個腳本語言。由JohnOusterhout創(chuàng)建。TCL很好學(xué),功效很強(qiáng)大。TCL經(jīng)常被用于快速原型開發(fā),腳本編程,GUI和測試等方面。TCL念作"tickle".特征
*全部數(shù)據(jù)類型都能夠看作字符串,含有強(qiáng)大字符處理能力。
*語法規(guī)則相當(dāng)簡單。
*很輕易用C,C++,或者Java擴(kuò)展。
*解釋語言,代碼能夠動態(tài)改變。
*平臺無關(guān)。Win32,UNIX,Mac
上都能夠跑。
*代碼緊湊,易于維護(hù)。TCL是當(dāng)今EDA軟件系統(tǒng)中普遍采取一個腳本語言,如SynopsysDC中dc_shell-t>和SynopsysPrimeTime中pt_shell>就是基于這種腳本,實(shí)際上TCL已經(jīng)成為了一個工業(yè)標(biāo)準(zhǔn)。
3/90CompanyLogo二、TCL語法
語法
簡單來說,TCL語法就是TCL解釋器對TCL命令進(jìn)行分析規(guī)則集合。TCL腳本可視為一個包含許多TCL指令(TCLcommand)程序。一個TCL指令基本語法為:commandarg1arg2arg3….在TCL語言中,每行指令第一個單字為指令名稱空格符用來分隔指令名稱與各個個別參數(shù),個別指令分隔是以分號與換行符號作為分隔符。一個參數(shù)假如超出一個英文單字(字符串中間穿插空白或TAB鍵),可用雙引號與大括號將這些元素組成(grouping)單一一個參數(shù)。使用雙引號與大括號差異,在于TCL針對雙引號中字符串會做置換處理(substitution),比如變量值代換或是執(zhí)行包含于字符串中TCL指令(使用中括號來表示),而對于大括號所括住內(nèi)容TCL則不會有這些置換處理。
4/90CompanyLogo二、TCL語法舉例說明:setx4sety6putsx顯示結(jié)果xputs$x顯示結(jié)果4puts"$x+$y=[expr$x+$y]“顯示結(jié)果4+6=10puts{$x+$y=[expr$x+$y]}顯示結(jié)果$x+$y=[expr$x+$y]
5/90CompanyLogo二、TCL語法下表所列符號在TCL語言里有特殊意義:置換符號(substitutionsymbols)$:變量值置換符號。$符號用來取出指定變量值。底下利用set指令設(shè)定x變量值,并用puts指令輸出x內(nèi)容:setx5puts$x如上列最終一行程序代碼,取出變數(shù)值時需在變量名稱前加上$符號。[]:命令置換符號。TCL將中括號中內(nèi)容視為一個指令,會執(zhí)行其中指令并將結(jié)果傳回。puts"$x+$y=[expr$x+$y]"在做完x與y兩個變數(shù)置換后,TCL解譯器碰到中括號認(rèn)為其中為另一個可執(zhí)行指令,指令名稱為expr。在執(zhí)行expr指令前,TCL先將x與y值置換后,傳遞給expr指令并呼叫執(zhí)行之。expr指令用來做數(shù)學(xué)式子運(yùn)算,會負(fù)責(zé)剖析參數(shù)并做數(shù)學(xué)運(yùn)算。6/90CompanyLogo二、TCL語法群組(groupingsymbols)“”:雙引號可將多個元素組成單一一個參數(shù),引號內(nèi)內(nèi)容會被TCL進(jìn)行置換處理,包含變量置換與命令置換。{}:大括號功效與雙引號相同,但TCL不會對括號中內(nèi)容做任何解釋或處理,會照將括號中內(nèi)容視為一個參數(shù),照本宣科原原本當(dāng)?shù)貍鬟f給指令去處理。比如Demo1.tclL6:puts{$x+$y=[expr$x+$y]}因?yàn)門CL對大括號中內(nèi)容不做任何處理,所以它輸出為$x+$y=[expr$x+$y]。另外,TCL不會將大括號中換行符號視為一個指令結(jié)束,假如一個指令參數(shù)很長時,我們就能夠利用大括號這么寫,把換行符號當(dāng)成是參數(shù)一部份:puts{$x+$y=[expr$x+$y]}7/90CompanyLogo二、TCL語法其它\:和Cbase語言一樣,反斜線可將特殊字符做跳脫處理。比如\n代表換行符號。在TCL語言里,假如一個指令超出一行,亦可在行尾使用反斜線做為續(xù)行符號(VB指令假如超出一行,則是在行尾用底線符號代表續(xù)行)。;或者TAB鍵:代表一個TCL指令結(jié)束符號。#:批注符號。通常我們會在一行程序代碼第一個字符打上#符號,以代表本行程序?yàn)榕?。注意!假如?符號前有TCL指令,必須像這么做:putshello;#hereiscomment在#符號前加上一個分號代表前面指令結(jié)束。假如不這么做,那TCL便會把#視為一個參數(shù)丟給puts指令去做處理。8/90CompanyLogo二、TCL語法變量TCL變量能夠隨時建立不用事先宣告,變量名稱取法也沒有任何限制,所以能夠使用任何字符來為變量命名,甚至變量名跟指令名稱相同也沒問題。使用時只有一點(diǎn)要注意,就是TCL是大小寫有別語言。通常,我們以set指令來設(shè)定變量值:setx5sety6setPI3.14setPI*26.28;#注意!變量名稱是PI*2puts$PI*2setPITCL
set指令除了設(shè)定變量值用途外,也能夠用來取出變量內(nèi)容,如上列程序最終一行使用set指令取出PI值(注意!這邊不用在變量名稱前加上$符號)。unset指令用來刪除一個或多個變量,來釋放內(nèi)存空間:unsetxyPI9/90CompanyLogo二、TCL語法置換與群組處理(SubstitutionandGrouping)底下是TCL置換處理與群組幾點(diǎn)規(guī)則整理:1、TCL指令參數(shù)是以空格符分隔,能夠使用雙引號或大括號將多個元素組成一個參數(shù)。假如是以大括號組出一個參數(shù),TCL不會對括住內(nèi)容進(jìn)行任何置換,在對應(yīng)結(jié)束大括號出現(xiàn)前,任何字符都將視為參數(shù)一部份,包含換行符號、分號或是內(nèi)部巢狀大括號。2、假如是以雙引號組出一個參數(shù),則在對應(yīng)結(jié)束雙引號出現(xiàn)前,雙引號中內(nèi)容會被TCL進(jìn)行置換動作。3、假如參數(shù)或是雙引號內(nèi)單字是以變量符號$為開頭,則TCL為會進(jìn)行變量置換。4、假如參數(shù)或是雙引號中有中括號,則在對應(yīng)中括號出現(xiàn)前,TCL會對中括號中內(nèi)容進(jìn)行指令置換。5、因?yàn)門CL是以空格符作為參數(shù)分隔符,所以要防止以下錯誤:if{$x>1}{puts$x}需要在此加上一個空格符,隔開if指令第二及第三個參數(shù)。
10/90CompanyLogo二、TCL語法TCL數(shù)學(xué)運(yùn)算符
-~!「減號(Unaryminus)」/「NOT位運(yùn)算(Bit-wisenot)」/「NOT布爾邏輯運(yùn)算(Logicalnot)」。這些運(yùn)算不能夠用來操作字符串(string)操作數(shù),而且「NOT位運(yùn)算」只限于整數(shù)操作。*/%「乘(Multiply)」/「除(divide)」/「余數(shù)(remainder)」。這些運(yùn)算不能夠用來操作字符串(string)操作數(shù),而且「余數(shù)」運(yùn)算只限于整數(shù)操作。+-「加(Add)」與「減(subtract)」。限用于數(shù)值操作數(shù)。<<>>「左右移位運(yùn)算(ShiftLeft/Right)」。運(yùn)算只限于整數(shù)操作。<><=>=布爾運(yùn)算「小于(less)」/「大于(greater)」/「小于等于(lessthanorequal)」/「大于等于(greaterthanorequal)」。假如條件成立這些運(yùn)算子會產(chǎn)生「1」結(jié)果,不然產(chǎn)生「0」。11/90CompanyLogo二、TCL語法TCL數(shù)學(xué)運(yùn)算符
==!=布爾運(yùn)算「等于(equal)」/「不等于(notequal)」。每個運(yùn)算會產(chǎn)生0/1結(jié)果??蛇m適用于任何操作數(shù)。&「AND位運(yùn)算(Bit-wiseand)」。限于整數(shù)操作。^「XOR位運(yùn)算(Bit-wiseexclusiveor)。限于整數(shù)操作。&&「AND布爾邏輯運(yùn)算(Logicaland)」。假如參加兩個操作數(shù)都非零話會得到1結(jié)果,不然話會得到0。限用于數(shù)值操作數(shù)(不限整數(shù)或小數(shù))。||「OR布爾邏輯運(yùn)算(Logicalor)」。假如參加兩個操作數(shù)都是零話會得到0結(jié)果,不然話會得到1。限用于數(shù)值操作數(shù)(不限整數(shù)或小數(shù))。x?y:z假如x為真時傳回y不然傳回z12/90CompanyLogo三、數(shù)據(jù)形態(tài)
TCL語言基本數(shù)據(jù)型態(tài)有:stringlistarrayhandle13/90CompanyLogo三、數(shù)據(jù)形態(tài)
String字符串?dāng)?shù)據(jù)型態(tài)字符串是TCL語言最基本數(shù)據(jù)型態(tài),常見字符串處理指令有:string、append、format、scan以及binary。比如使用string指令來計(jì)算指定字符串長度:%setname“ZhangBin”%stringlength$name=>11其中string指令第一個參數(shù)代表對字符串操作方式。14/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringbytelengthstr傳回字符串字節(jié)數(shù)(以UTF-8encoding計(jì)算),傳回值可能會跟計(jì)算字符數(shù)stringlength有所不一樣stringcompare?-nocase??-lengthlen?str1str2比較兩字符串內(nèi)容,若相同傳回『0』、其它傳回『1』。-nocase:表示不分大小寫例:%stringcompare–nocaseRickrick=>0-length:能夠指定要比較字符串長度例:stringcompare–length3rickricp=>015/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringequal?-nocase?str1str2比較str1和str2內(nèi)容,若相同傳回『1』、不然傳回『0』stringfirstsubStringstringstartIndex傳回string中相符子字符串第一個出現(xiàn)位置,若無則傳回『-1』。startIndex代表從字符串指定位置開始搜尋子字符串。例:%stringfirstrickilovericktoo=>516/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringindexstringcharIndex傳回index位置所在字符,index計(jì)算從『0』開始,使用『end』代表最終一個字符或使用『end-N』代表相對于最終一個字符位置。例:%stringindexrick2=>c%stringindexrickend=>k%stringindexrickend-2=>i17/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringlaststring傳回string中最終一個與子字符串相符位置,若無則傳回『-1』。startIndex代表從字符串指定位置開始搜尋子字符串。例:%stringfristrickrickANDrick=>0%stringlastrickrickANDrick=>7stringlengthstring傳回字符串字符數(shù)18/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringmap?-nocase?charMapstring依據(jù)charMap中字符串對應(yīng)表,更換字符串中內(nèi)容。例:%stringmap{ic}rick=>rcck%stringmap{rija}rick=>jack%stringmap{rjia}rick=>jack19/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringmatch?-nocase?patternstr將字符串拿來與pattern比對,若是相同則傳回『1』,若不一樣則傳回『0』。字符串比正確方式為globstylepatternmatch:?:表示一個任意字符*:表示隨意數(shù)量任意字符。[]:表示中括號中集合一個任意字符,[abc]定義符合abc任意一個字符,[a-z]定義符合全部小寫英文字母任意一個字符。\?:表示一個問號字符。例:%stringmatchtcl*tcltk=>1%stringmatchtcl*rick=>020/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法『?』表示一個任意字符。例:%stringmatchric?rick=>1%stringmatchri??rick=>1%stringmatchric?rickpeng=>0『[]』表示在中括號集合中任意一個字符。例:%stringmatch{[a-z]}rick=>0%stringmatch{[a-z][a-z][a-z][a-z]}rick=>121/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringrangestrij取出str字符串中從i到j(luò)位置字符??捎胑nd字符代表最終一個字符。例:%setx[stringrangeiloverick25]=>overstringrepeatstrcount將str字符串重復(fù)印出count所表示次數(shù)。例:%stringrepeatrick3=>rickrickrick22/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringreplacestrfirstlast?newstr?以空字符串或newstr取代指定范圍字符串。First與last分別為所要取代字符串其頭、尾位置,newstr則為所欲代換成字符串,newstr預(yù)設(shè)為空字符串代表要截?cái)嘀付ǚ秶址?。例?stringreplaceiloverick14hateihaterickstringtolowerstring?first??last?將所定義字符串范圍中之字符轉(zhuǎn)換為小寫字符。例:%stringtolowerILOVERICK14=>IloveRICK23/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringtotitlestring?first??last?將所定義字符串范圍中第一個字母轉(zhuǎn)換成大寫。例:%stringtotitleiloverick14=>iLoverickstringtoupperstring?first??last?將所定義字符串范圍中之字符轉(zhuǎn)換為大寫字符。例:%stringtoupperiloverick14iLOVErick24/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringtrimstring?chars?去除指定字符串頭、尾中包含在chars中定義任何字符。chars系統(tǒng)預(yù)設(shè)為空格符。例:%stringtrimililoverickricklilove%stringtrimkkkloverickkkkkrick=>lovestringtrimleftstring?chars?去除在string左側(cè)包含在chars中定義任何字符,chars系統(tǒng)預(yù)設(shè)為空格符。例:%stringtrimleftilovericki=>loverick%stringtrimleftkkkloverickkkklk=>overickkkk25/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringtrimrightstring?chars?去除在string右側(cè)包含在chars中定義任何字符,chars系統(tǒng)預(yù)設(shè)為空格符。例:%stringtrimrightiloverickrick=>ilovestringwordendstrindex傳回指定str字符串中指定位置上單字下一個位置。例:%stringwordend{Iloverick}5=>626/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令使用方法stringwordstartstrindex傳回str字符串中指定位置上單字起始位置。例:%stringwordstartiloverick9=>027/90CompanyLogo三、數(shù)據(jù)形態(tài)
string指令注意事項(xiàng)字符串比較盡可能使用stringcompare或stringequal,比如:if{[stringcompare$s1$s2]==0}{#s1ands2areequal}if{[stringequal$s1$s2]}{#s1ands2areequal}防止使用==來比較字符串,即使以下程序代碼中,比較兩個字符串有不一樣內(nèi)容,仍會輸出ack訊息,這是因?yàn)門CL會試圖將字符串轉(zhuǎn)換為數(shù)字再進(jìn)行比較,于是16進(jìn)位0xa會等于十進(jìn)制10,這可不是我們所期望結(jié)果,所以提議盡可能使用stringcompare或stringequal來取代這種寫法:if{“0xa”==“10”}{puts“ack”}28/90CompanyLogo三、數(shù)據(jù)形態(tài)
append指令append指令用來將新項(xiàng)目附加到指定變量內(nèi)容后。例:%setxii%appendxloveyouIloveyou29/90CompanyLogo三、數(shù)據(jù)形態(tài)
format指令與C語言中printf十分相同指令,format指令依據(jù)指定格式將字符串格式化。
formatspecvalue1value2其中spec參數(shù)包含了文字或是任何字符。而普通定義關(guān)鍵詞包含了六大部份:位置指示(positionspecifier)旗標(biāo)(flags)欄寬(fieldwidth)準(zhǔn)確度(precision)字符長度(wordlength)轉(zhuǎn)換字符(conversioncharacter)因?yàn)樵诟袷蕉x時候常會有空白夾雜其中,切記要使用雙引號或大括號將定義內(nèi)容群組(Grouping)起來。30/90CompanyLogo三、數(shù)據(jù)形態(tài)
d:帶正負(fù)號整數(shù)(Signedinteger)u:無正負(fù)號整數(shù)(Unsignedinterger)i:帶正負(fù)號整數(shù)。表示成為hex(0x)或octal(0)o:無正負(fù)號八進(jìn)制數(shù)值。(Unsignedoctal)xorX:無正負(fù)號十六進(jìn)制數(shù)值。(Unsignedhexadecimal),x表示為輸出小寫結(jié)果。c:把數(shù)字對映成為ASCII字符s:字符串f:浮點(diǎn)數(shù),格式為a.beorE:浮點(diǎn)數(shù),格式為科學(xué)符號,a.bE+-cgorG:浮點(diǎn)數(shù),格式為%f或%e,依實(shí)際長度取短表示31/90CompanyLogo三、數(shù)據(jù)形態(tài)
位置指示表示方法為i$,意思是直接取得第i個參數(shù)值。參數(shù)計(jì)數(shù)是從1開始。底下范例透過位置指示直接取用format第二個參數(shù)內(nèi)容:
%format{%2$s}onetwothree=>two因?yàn)樵赥CL中,$符號有特殊意義,上列指令以大括號抑制了格式化字符串中$符號變量置換作用,所以i$功效得以正常演出。但假如格式化字符串是以雙引號來做群組(grouping),我們必須利用反斜線仰制$符號變量置換:
%format“%2\$s”onetwothere=>two32/90CompanyLogo三、數(shù)據(jù)形態(tài)
scan指令與C語言中scanf十分相同指令,scan指令依據(jù)指定格式化條件剖析字符串并將結(jié)果放入變量中。
scanstringformat?varName??varName?…例:
%scan“a123Rick”charnumstr%puts“char=$charnum=$numstr=$str”=>char=97num=123str=rickscan指令與format指令非常相像,%c會將某個字符ASCII數(shù)值讀入變數(shù)中。33/90CompanyLogo三、數(shù)據(jù)形態(tài)
Binary指令
binaryformattemplatevalue?value….?binaryscanvaluetemplatevariable?variable…?這邊我們看看幾個binary指令慣用使用方法。使用c為模板(template),將數(shù)值97格式化為ASCII字符:%binaryformatc97=>a使用c為模板(template),將字符6
ASCII值讀進(jìn)var1變數(shù)中:%setinput6%binaryscan$inputcvar1%setvar15434/90CompanyLogo三、數(shù)據(jù)形態(tài)
一次scan多個字符碼到list中:
%binaryscanabcde“c3”list%setlist=>979899%lindexlist1;#取出list中第1個元素
=>98換個方式,scan到多個個別變量中:
%binaryscanabcde“ccc”xyz%puts“x=$xy=$yz=$z”%x=97y=98z=9935/90CompanyLogo三、數(shù)據(jù)形態(tài)
List串行數(shù)據(jù)型態(tài)TCL
list指令有l(wèi)ist,lindex,llength,lrange,lappend,linsert,lreplace,lsearch,lset,lsort,concat,join,andsplit等,提供您將數(shù)據(jù)放入list、取出list中元素、計(jì)算list元素?cái)?shù)量、取代list中指定元素等等功效。通常我們會搭配foreach使用,將list中元素一一取出做運(yùn)算。然而,在表現(xiàn)比較復(fù)雜數(shù)據(jù)結(jié)構(gòu)時,list并不是最好選擇方案,在這些場所里使用TCL
array型態(tài)會比list愈加適合。36/90CompanyLogo三、數(shù)據(jù)形態(tài)
listarg1arg2…..將list指令參數(shù)將建組成一個list。例:%listricktest=>ricktest用set指令建構(gòu)一個list:%setmylist{ricktest}=>ricktest37/90CompanyLogo三、數(shù)據(jù)形態(tài)
lindexlisti傳回在list之中第i個項(xiàng)目標(biāo)內(nèi)容。能夠指定多個index,以取出巢狀list中項(xiàng)目。例:%setx{rick}=>rick%lindex$x2=>c38/90CompanyLogo三、數(shù)據(jù)形態(tài)
llengthlist傳回在list之中項(xiàng)目數(shù)。例:%setx{rick}=>rick%llength$x=>439/90CompanyLogo三、數(shù)據(jù)形態(tài)
lrangelistij傳回list之中從i至j項(xiàng)目。例:%setlist{tpts1}=>tpts1%sety[lrange$list12]=>pt40/90CompanyLogo三、數(shù)據(jù)形態(tài)
lappendlistVarargarg…..附加項(xiàng)目到listVar之后例:%setlistrick=>rick%lappendlistiloveyou=>rickiloveyou41/90CompanyLogo三、數(shù)據(jù)形態(tài)
Linsertlistindexargarg..將數(shù)據(jù)插入在第i個項(xiàng)目之前。例:%setlist{iloverick}=>iloverick%linsert$list1really=>ireallyloverick42/90CompanyLogo三、數(shù)據(jù)形態(tài)
lreplacelistijargarg…將list中從i到j(luò)個項(xiàng)目取代為指定參數(shù)。lreplace傳回取代后新list。例:%setlist{iloverick}=>iloverick%setlist2[lreplace$list11hate]=>ihaterick43/90CompanyLogo三、數(shù)據(jù)形態(tài)
lsearch?options?listpattern傳回與pattern比對相符合第一個元素位置,傳回-1假如沒有相符元素。預(yù)設(shè)比對方式為Glob。例:%setlist{iloverick}=>iloverick%lsearch$listlove=>144/90CompanyLogo三、數(shù)據(jù)形態(tài)
lsetlistVarindex?index…?value使用value設(shè)定list第i個元素值。例:%setlist{iloverick}=>iloverick%lsetlist1hate=>ihaterick45/90CompanyLogo三、數(shù)據(jù)形態(tài)
lsort?switches?list依據(jù)switch所指定選項(xiàng)為list排序。可用選項(xiàng)有-ascii,-dictionary,-integer,-real,-increasing,-decreasing,-indexix,-unique,-commandcommand.。例:%setlist[listmaacxlinognoc]%lsort$list=>cxlinmaaognoc46/90CompanyLogo三、數(shù)據(jù)形態(tài)
concatlistlist…將多個list串成一個。例:%setlist1[list1maa]%setlist2[list2cxlin]%setlist3[list3ognoc]%setlistAll[concatlist1list2list3]%llength$listAll=>647/90CompanyLogo三、數(shù)據(jù)形態(tài)
joinlist?joinString?將list中項(xiàng)目合并成一個字符串。能夠指定joinString作為每個項(xiàng)目間分隔,預(yù)設(shè)分隔字符為空白。例:%setlist[listiloverick]%join$list=>iloverick%join$list###=>i###love###rick48/90CompanyLogo三、數(shù)據(jù)形態(tài)
splitstring?splitchars?將字符串分割成一個list??梢灾付╯plitChars作為字符串中每個項(xiàng)目分隔識別符號。例:%setlist[split”abc”]%length$list=>3%setlist[split“a#b#c”“#”]=>abc%lrange$list0end=>abc49/90CompanyLogo三、數(shù)據(jù)形態(tài)
Array數(shù)組數(shù)據(jù)型態(tài)TCLarray和Perl
associativearray類似,數(shù)組是以字符串作為索引。數(shù)組在TCL語言中舉足輕重,許多數(shù)據(jù)結(jié)構(gòu)都是以數(shù)組為基礎(chǔ)設(shè)計(jì)而成。數(shù)組元素內(nèi)容設(shè)定一樣是使用set指令:%setprice(apple)10%setprice(orange)12%setquantity(apple)5%setdiscount(apple)0.8puts$price(apple)=>1050/90CompanyLogo三、數(shù)據(jù)形態(tài)
arrayexistsarr
判斷arr是否為一個數(shù)組。傳回1代表是數(shù)組。例:%setprice(apple)10%arrayexistsprice=>151/90CompanyLogo三、數(shù)據(jù)形態(tài)
arraygetarr?pattern?將arr索引及元素值交織建立成一個list后傳回。能夠使用樣式(Pattern)來做比對。例:%setprice(apple)10%setprice(orange)12%arraygetprice=>orange12apple1052/90CompanyLogo三、數(shù)據(jù)形態(tài)
arraynamesarr?mode??pattern?傳回arr索引list。能夠使用mode指定樣式比對方式(可為–exact、-glob(default)或–regexp)。例:%arraynamesprice=>orangeapple53/90CompanyLogo三、數(shù)據(jù)形態(tài)
arraysetarrlist依據(jù)list內(nèi)容建構(gòu)一個數(shù)組。例:%arraysetprice[listapple10orange12]%arraygetprice=>orange12apple1054/90CompanyLogo三、數(shù)據(jù)形態(tài)
arraysizearr傳回arr大小。例:%arraysizeprice=>255/90CompanyLogo三、數(shù)據(jù)形態(tài)
arrayunsetarr?pattern?判斷arr是否為一個數(shù)組。傳回1代表是數(shù)組。釋放符合樣式數(shù)組元素。假如沒有指定樣式,則會釋放整個數(shù)組。例:%arraysetprice[listapple10orange12]%arraygetprice=>orange12apple10%arrayunsetpriceapp*%arraygetprice=>orange12%setprice(apple)10%arraygetprice=>orange12apple10%arrayunsetprice%setprice=>can'tread"price":nosuchvariable56/90CompanyLogo三、數(shù)據(jù)形態(tài)
數(shù)組也常拿來與foreach循環(huán)搭配使用,比如:%setprice(apple)10%setprice(orange)12%arraygetprice=>orange12apple10%foreach{keyvalue}[arraygetprice]{“price($key)=$value”}=>price(orange)=12=>price(apple)=10或者這么寫,程序結(jié)果也會一樣:%foreachkey[arraynamesprice]{“price($key)=$price($key)”}57/90CompanyLogo三、數(shù)據(jù)形態(tài)
因?yàn)槭褂胊rrayget或foreach時,TCL作法是先產(chǎn)生一個暫時性list,這么會浪費(fèi)一些內(nèi)存空間與執(zhí)行速度。改用array搜尋功能夠加緊數(shù)組元素巡訪(iterate)速度:%setsearchToken[arraystartsearchprice]%while{[arrayanymoreprice$searchToken]}{setkey[arraynextelementprice$searchToken]setvalue$price($key)puts“$key=$value”}arraydonesearchprice$searchToken=>orange=12=>apple=1058/90CompanyLogo四、控制結(jié)構(gòu)如同先前TCL語法一節(jié)所介紹,對TCL來說每條敘述(Statement)都只是一個指令與傳遞給指令參數(shù),其中每個指令第一個英文單字為指令名稱。本節(jié)所要介紹控制結(jié)構(gòu),包含循環(huán)指令:while、for、foreach;條件判斷用指令:if及switch;錯誤處理用指令:catch;以及飾演配角一職用來調(diào)整控制結(jié)構(gòu)用指令:break、continue、return與error等等,實(shí)際上在TCL語言中,這些控制結(jié)構(gòu)也都是指令。這些控制結(jié)構(gòu)通常在一些條件成立時,會執(zhí)行其指令主體程序代碼(commandbody),比如:setx2sety3if{$x<$y}{puts“xislessthany!”}。59/90CompanyLogo四、控制結(jié)構(gòu)我們知道在TCL語言中,大括號能夠把多個元素(也就是很長字符串)群組起來變成一個參數(shù)。所以,以指令觀點(diǎn)來看上列if指令可知,if指令接收兩個參數(shù),其中第一個參數(shù)是一個條件敘述,只有在此條件成立情況下,指令主體(commandbody),也就是if指令第三個參數(shù),才會被if指令當(dāng)成是一段TCLScript把它觸動執(zhí)行之。我們也知道換行符號與分號是代表一個指令結(jié)束,假如一個指令參數(shù)太長時,能夠利用大括號括住參數(shù),把換行符號也看成是參數(shù)一部份。在控制結(jié)構(gòu)中,指令主體寫法通常都會和上列if指令一樣,使用大括號括住。這么做有兩個好處,第一是我們能夠在指令主體中寫很多行敘述,而這些敘述會被大括號群組起來變成一個參數(shù)傳給if指令,第二則是使用大括號能夠防止TCL解譯器在執(zhí)行if指令前,就先進(jìn)行置換處理,產(chǎn)生非預(yù)期結(jié)果。60/90CompanyLogo四、控制結(jié)構(gòu)IfThenElseIf指令是最基本控制結(jié)構(gòu),它語法是:ifexpression?then?body1?else??body2?if指令在條件測試(expression)結(jié)果為真是執(zhí)行指令主體(body1),不然執(zhí)行另一個指令主體(body2)。比如:if{$x>0}{puts“xisgreaterthanzero!”}else{puts“xislessthanzero!”}你能夠省略then跟else兩個關(guān)鍵詞,但像上面寫法一樣我們通常只省略then。另外在條件測試和指令主體兩參數(shù),提議養(yǎng)成習(xí)慣用大括號將它他們括住。61/90CompanyLogo四、控制結(jié)構(gòu)當(dāng)你需要判斷一連串條件時,能夠使用if搭配elseif指令:if{$temperature<24}{puts“It’scool!”}elseif{$temperature<30}{puts“It’salittlehot!”}else{puts“It’squitehot!”}然而,假如要判斷條件式很多,能夠選擇使用底下要介紹switch指令62/90CompanyLogo四、控制結(jié)構(gòu)Switchswitch指令可用來比對許多樣式(patternmatching),并執(zhí)行符合樣式字符串指令主體。switch語法為:switchflagsvaluepattern1body1pattern2body2…?defaultdefaultBody?只有第一個樣式比對符合指令主體會被執(zhí)行,其它則會被忽略。能夠在switch指令最終加上一個default樣式,代表假如沒有任何一個樣式比對符合話,就執(zhí)行default指令主體。你能夠設(shè)定switch指令flags,指定字符串樣式比對方法:-exact:使用完全相符樣式比對方法。即要比正確value與比正確樣式字符串完全相同才算比對成功。-glob:使用globstyle樣式比對方法。請參考數(shù)據(jù)型態(tài)一節(jié)相關(guān)stringmatch說明。globstyle樣式比對是switch指令預(yù)設(shè)比對方法。-regexp:使用『常規(guī)表示式(RegularExpression)』樣式比對方法。相關(guān)常規(guī)表示式請見后述。--:代表switch指令flag設(shè)定已結(jié)束,接著下一個字符串是要被比正確字符串(value)。使用--允許value是以-符號開頭字符串。通常我們會在value字符串前加上這個flag。63/90CompanyLogo四、控制結(jié)構(gòu)值得注意一點(diǎn)是,switch樣式比對有沒有使用大括號括住影響,我們直接從底下范例程序及執(zhí)行結(jié)果來看:setx5sety5switch-glob--$x\$y{puts“x=y”}\{[0-9]}{puts“x=5”}\default{puts“x>10”}switch-glob--$x{$y{puts“x=y”}[0-9]{puts“x=5”}default{puts“x>10”}}執(zhí)行結(jié)果為:x=yx=564/90CompanyLogo四、控制結(jié)構(gòu)While指令語法:whilebooleanExprbodywhile指令有兩個參數(shù),一是條件測試,一是指令主體。while指令會不停判斷條件敘述,并在條件測試結(jié)果為真時,執(zhí)行指令主體。以下程序會開啟autoexec.bat檔,讀取檔案中內(nèi)容并輸出到Console中,程序中g(shù)ets指令會從指定檔案讀取一行數(shù)據(jù),并傳回讀取到字符數(shù),讀到檔案尾時傳回-1:setfileId[openc:/autoexec.batr]while{[gets$fileIdline]>=0}{putsstdout$line}close$fileId65/90CompanyLogo四、控制結(jié)構(gòu)在使用while指令時要注意TCL置換處理,比如底下程序會是一個無窮循環(huán),因?yàn)門CL在執(zhí)行while指令前,已將$i代換為0才傳遞給while指令作為參數(shù),所以while指令條件測試結(jié)果永遠(yuǎn)為真:seti0;while$i<10{incrI}要防止請保持良好寫碼習(xí)慣(codingstyle),使用大括號來防止TCL置換,防止非預(yù)期錯誤:seti0;while{$i<10}{incrI}66/90CompanyLogo四、控制結(jié)構(gòu)For指令語法:forinitialtestfinalbodyTCLfor指令和C語言相類似,for指令需要四個參數(shù)。第一個參數(shù)用來設(shè)定循環(huán)起始狀態(tài),比如計(jì)數(shù)值起始設(shè)定,第二個參數(shù)用來做條件測試,第三個參數(shù)是循環(huán)指令主體(body)每執(zhí)行一次后要做事,通常我們會在這邊增減計(jì)數(shù)值。底下范例使用循環(huán)印出三次當(dāng)前時間:for{setx1}{$x<=3}{incrx}{puts[clockformat[clockseconds]-format{%D%T}]}=>06/22/0422:04:10=>06/22/0422:04:11=>06/22/0422:04:1267/90CompanyLogo四、控制結(jié)構(gòu)其中clockseconds會以秒數(shù)為單位傳回當(dāng)前時間,clockformat則用來將指定時間進(jìn)行格式化,本例格式化字符串為{%D%T}代表輸出時間格式為%m/%d/%y%H:%M:%S。另外after指令會讓程序停留一段時間后繼續(xù)進(jìn)行,停留時間單位為千分之一秒(millisecond)。之前while指令讀取檔案內(nèi)容范例,能夠用for指令改寫成(能夠看到此處于for指令initial與final兩個參數(shù)都是空):setfileId[openc:/autoexec.batr]for{}{[gets$fileIdline]>=0}{}{putsstdout$line}close$fileId使用for指令來巡訪(iterate)一個list,印出list中內(nèi)容:for{seti0}{$i<[llength$list]}{incri}{puts[lindex$list$i]}68/90CompanyLogo四、控制結(jié)構(gòu)但使用for指令巡訪list并不是好寫法,它效率不是很好,因?yàn)閒or指令需要不停呼叫l(wèi)length及l(fā)index去取得list狀態(tài)。比很好方案,是選擇使用foreach指令。Foreach指令語法:foreachlistVarlistbodyforeach指令主要用于list巡訪(iterate),來看一個數(shù)列加總寫法:settotal0setnumList[list12345678910]foreachnum$numList{settotal[expr$total+$num]}putsstdout“total=$total”=>total=5569/90CompanyLogo四、控制結(jié)構(gòu)foreach指令也可針對一個list,設(shè)定多個循環(huán)變量來處理之,比如:foreach{keyvalue}{apple10orange12}{puts“$key=$value”}=>apple=10=>orange=12對于數(shù)組,可先讓arrayget指令將數(shù)組索引與值變成一個list后傳回,再拿給foreach指令利用:setprice(apple)10setprice(orange)12foreach{keyvalue}[arraygetprice]{puts“$key=$value”}=>orange=12=>apple=1070/90CompanyLogo四、控制結(jié)構(gòu)break與continuebreak指令和continue指令用于循環(huán)結(jié)構(gòu)中,break用來中止循環(huán),而continue則用來讓循環(huán)進(jìn)行下一個重復(fù)(iteration)。71/90CompanyLogo四、控制結(jié)構(gòu)Catch指令語法:catchcommand?resultVar?當(dāng)TCL指令發(fā)生錯誤時,比如使用open開啟檔案失敗,TCL會中止當(dāng)前執(zhí)行TCLScript。我們能夠使用catch指令來補(bǔ)捉這些錯誤,catch指令會執(zhí)行指定指令,假如指令沒有發(fā)生錯誤,則catch指令會將指令傳回值放入第二個參數(shù),或是在指令發(fā)生錯誤時將錯誤訊息放入第二個參數(shù)。假如沒有捕捉到任何錯誤,catch指令本身傳回值會是0,不然會傳回非0數(shù)值。我們將前面讀取檔案內(nèi)容加上catch指令,讓程序更嚴(yán)謹(jǐn)一些防止執(zhí)行到二分之一便被TCL中止執(zhí)行:if{[catch{openc:/autoexec.batr}fileId]}{puts“openingfileerror:$fildId”}else{while{[gets$fileIdline]}{puts$line}close$fileId}72/90CompanyLogo五、TCL過程
TCL程序跟普通程序語言程序一樣,是程序模塊化工具,當(dāng)你定義好一個procedure時,它就會變成一個TCL指令。TCL使用proc指令來定義一個procedure:procprocNameargListbodyproc指令第一個參數(shù)是procedure名稱,第二個參數(shù)是procedure參數(shù)列,第三個參數(shù)則是procedure指令主體,會在procedure被呼叫時執(zhí)行起來。關(guān)于程序傳回值,除非你用return指令明示程序傳回值,不然TCL會將程序最終一行指令執(zhí)行結(jié)果當(dāng)做是程序傳回值。比如定義圓面積procedure:setPI[expr2*asin(1.0)]procc_area{rad}{globalPIreturn[expr$PI*$rad*$rad]}%c_area3=>28.2743338823
73/90CompanyLogo五、TCL過程過程定義和返回值比如:%procadd{xy}{expr$x+$y}proc命令第一個參數(shù)是你要定義過程名字,第二個參數(shù)是過程參數(shù)列表,參數(shù)之間用空格隔開,第三個參數(shù)是一個TCL腳本,代表過程體。proc生成一個新命令,能夠象固有命令一樣調(diào)用:%add123
在定義過程時,你能夠利用return命令在任何地方返回你想要值。return命令快速中止過程,并把它參數(shù)作為過程結(jié)果。比如:%procabs{x}{if{$x>=0}{return$x}return[expr-$x]puts“procabsfinished”}過程返回值是過程體中最終執(zhí)行那條命令返回值。
74/90CompanyLogo五、TCL過程局部變量和全局變量對于在過程中定義變量,因?yàn)樗鼈冎荒茉谶^程中被訪問,而且當(dāng)過程退出時會被自動刪除,所以稱為局部變量;在全部過程之外定義變量我們稱之為全局變量。TCL中,局部變量和全局變量能夠同名,二者作用域交集為空:局部變量作用域是它所在過程內(nèi)部;全局變量作用域則不包含全部過程內(nèi)部。這一點(diǎn)和C語言有很大不一樣.
假如我們想在過程內(nèi)部引用一個全局變量值,能夠使用global命令。比如:%seta44%procsample{x}{ globala incra return[expr$a+$x]}%sample3875/90CompanyLogo五、TCL過程%seta5
全局變量a在過程中被訪問。在過程中對a改變會直接反應(yīng)到全局上。假如去掉語句globala,TCL會犯錯,因?yàn)樗徽J(rèn)識變量a.
76/90CompanyLogo五、TCL過程缺省參數(shù)和可變個數(shù)參數(shù)TCL還提供三種特殊參數(shù)形式:首先,你可以定義一個沒有參數(shù)過程,例如:procadd{}{expr2+3}其次,可以定義具有缺省參數(shù)值過程,我們可認(rèn)為過程部分或全部參數(shù)提供缺省值,如果調(diào)用過程時未提供那些參數(shù)值,那么過程會自動使用缺省值賦給對應(yīng)參數(shù)。和C\C++中具有缺省參數(shù)值函數(shù)一樣,有缺省值參數(shù)只能位于參數(shù)列表后部,即在第一個具有缺省值參數(shù)后面全部參數(shù),都只能是具有缺省值參數(shù)。例如:procadd{val1{val22}{val33}}{ expr$val1+$val2+$val3 }則:add1//值為6add220//值為25add456//值為1577/90CompanyLogo五、TCL過程另外,TCL過程定義還支持可變個數(shù)參數(shù),假如過程最終一個參數(shù)是args,那么就表示這個過程支持可變個數(shù)參數(shù)調(diào)用。調(diào)用時,位于args以前參數(shù)象普通參數(shù)一樣處理,但任何附加參數(shù)都需要在過程體中作特殊處理,過程局部變量args將會被設(shè)置為一個列表,其元素就是全部附加變量。假如沒有附加變量,args就設(shè)置成一個空串,下面是一個例子:
procadd{val1args}{setsum$val1 foreachi$args{ incrsum$i }return$sum }則:
add2//值為2 add23456//值為20
78/90CompanyLogo五、TCL過程其中我們也定義了一個全域變量PI,接收一個參數(shù)rad作為半徑。程序在procedure外使用expr及TCL內(nèi)建數(shù)學(xué)函式asin計(jì)算圓周率PI,并在c_area程序中使用這個全域變量來計(jì)算圓面積。值得注意一點(diǎn)時,在程序變量空間(Scope)預(yù)設(shè)是看不到全域變量,假如要在程序中存取全域變量,則必須先使用global來宣告才行。我們也能夠指定程序參數(shù)默認(rèn)值(defaultvalue),比如底下修改后c_area程序在沒有參數(shù)情況下,會將rad參數(shù)默認(rèn)值設(shè)成1:setPI[expr2*asin(1.0)]procc_area{{rad1}}{globalPIreturn[expr$PI*$rad$rad]}%c_area3=>28.2743338823%c_area=>3.1415926535979/90CompanyLogo五、TCL過程我們也能夠定義可接收不定參數(shù)程序,透過args這個關(guān)鍵詞(TCL會將接收到參數(shù)變成一個list放入args變數(shù)中):procprintArgs{args}{puts“Totalarguments:[llength$args]”puts“Theargumentlist=[lrange$args0end]”}%printArgs=>Totalarguments:0=>Theargumentslistare:%printArgsonetwothree=>Totalarguments:3=>Theargumentslistare:onetwothree80/90CompanyLogo五、TCL過程在TCL語言里,我們甚至能夠使用rename指令將一個指令重新命名,比如將TCLunknown指令更名為originalUnknown:renameunknownoriginalUnknown接著我們能夠自行定義unknown,替unknown訂定新行為,有需要時再呼叫originalUnknown,這么對原本呼叫unknown使用者來說,會完全轉(zhuǎn)移到新定義unknown。另外,你也能夠使用rename指令將現(xiàn)有指令定義成空字符串,如此一來,指令就會不存在。比如,我們將exec指令定義成空字符串,這么使用者便不能用exec執(zhí)行其它程序:renameexec{}81/90CompanyLogo五、TCL過程任何一個Tcl命令都能夠被重命名或者刪除,包含內(nèi)建命令以及應(yīng)用中定義過程和命令。重命名一個內(nèi)建命令可能會很有用,比如,exit命令在Tcl中被定義為馬上退出過程。假如某個應(yīng)用希望在退出前取得去除它內(nèi)部狀態(tài)機(jī)會,那么能夠這么作:
renameexitexit.oldprocexitstatus{application-specificcleanup...exit.old$status}82/90CompanyLogo六、TCL內(nèi)建指令after等后一段時間后執(zhí)行指定指令append附加參數(shù)內(nèi)容到指定變量之后array用來查詢數(shù)組狀態(tài)及搜尋數(shù)組元素binary用來做字符串與二進(jìn)制數(shù)據(jù)轉(zhuǎn)換break用來中止循環(huán)catch補(bǔ)捉錯誤cd變更工作目錄clock用來取得時間及設(shè)定時間輸出字符串格式close用來關(guān)閉I/O串流(stream)concat用來將多個參數(shù)串成一個list,或是將多個list合成一個。console用來控制輸入命令用主控臺(Console)continue讓循環(huán)進(jìn)行下一個重復(fù)(iteration)error引發(fā)一個錯誤eof用來檢驗(yàn)檔案是否
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海外國語大學(xué)《地理科技論文寫作文》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海體育大學(xué)《計(jì)算機(jī)組成原理課程設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025藥品代理經(jīng)銷合同 標(biāo)準(zhǔn)版模板全
- 2025私人借貸合同范文
- 2025液晶電視安裝播放協(xié)議書,合同范本合同協(xié)議書范本
- 上海思博職業(yè)技術(shù)學(xué)院《跨國公司管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海視覺藝術(shù)學(xué)院《攝像技術(shù)與藝術(shù)(下)》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海師范大學(xué)天華學(xué)院《系統(tǒng)可靠性設(shè)計(jì)與分析課程設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025電視欄目贊助合同
- 北京實(shí)習(xí)報(bào)告范文
- 設(shè)計(jì)構(gòu)成與應(yīng)用 完整全套教學(xué)課件 第1-12章 平面構(gòu)成設(shè)計(jì)元素- 立體構(gòu)成在建筑設(shè)計(jì)中的應(yīng)用
- 2、廣東省高速公路發(fā)展股份有限公司 2019年度內(nèi)控缺陷整改臺賬
- 物業(yè)公司安全生產(chǎn)檢查表
- 室內(nèi)配套設(shè)備家具、家電及窗簾等項(xiàng)目供貨服務(wù)方案技術(shù)投標(biāo)方案
- 公司規(guī)章制度清單
- 《高效能人士的七個習(xí)慣》PPT演講模板
- 獨(dú)領(lǐng)風(fēng)騷的古代技術(shù)創(chuàng)造
- 實(shí)用俄語會話知到章節(jié)答案智慧樹2023年山東交通學(xué)院
- 廣西南寧市2022-2023學(xué)年四年級數(shù)學(xué)第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 管理英語4寫作
- 國家電網(wǎng)招聘(計(jì)算機(jī)類)專業(yè)知識筆試歷年考試真題匯總(附答案)
評論
0/150
提交評論