1. 程式人生 > >【轉】TCL語法簡介

【轉】TCL語法簡介

concat 替換 似的 index 實現 需要 執行 itl PV

1,腳本構成

set a 2
set b 3
//
set a 2;set b 3

TCL腳本可以包括多個命令,命令間使用換行符或者分號分開,一個命令使用空格分開命令、變量等其他參數。

2,置換

  • 變量置換

  

set c $a+$b //c = a+b=2+3

使用美元符號$進行變量置換,上式中c=2+3而不是5,要讓c=5需要使用命令置換。

  • 命令置換

  

set c [expr $a+$b]

當使用[]時,括號內第一個字符會當做命令,後續的作為命令參數,expr命令用於進行表達式求值。對求值結果進行返回並賦值給c。

  • 反斜杠\置換

\使得特殊字符失去特殊含義

set msg money\ \$3333

使用使用\,上述空格不會被當做命令間字符分割處理,$也不會當做變量置換。

  • 雙引號“”與花括號{}

使用雙引號“”和花括號{}也可以使得解釋器將分隔符置換符等特殊字符當做普通字符。“”只是對分割符不處理,對換行符、變量置換$、命令置換依然會處理

set y "$a xxx" //y -> 2 xxx

使用花括號所有特殊字符都變成普通字符

set y {/n$x [expr 10 +100]} //y->/n$x [expr 10 +100] 

3,註釋

行首的‘#’符開始表示該行為註釋。‘#‘必須出現在TCL解釋器期望命令的第一個字符。因此‘#‘出現在行首及‘;‘後後面內容才能當做註釋。

# this is a comment
set msg "hello world!" ;#this is another comment
set msg2 "nice day!" #error,this is not a comment

4,變量

TCL變量由名字和值構成,名字和值均可以是任意字符。要註意的是‘$’進行變量置換時是值得第一個不是字母、數字、下劃線的字符之間的單詞符號作為被置換變量名。使用set命令來設置變量,unset 命令取消變量。

技術分享圖片
set a 2
set a.1 4
set b $a.1
set c ${a.1}
# b=2.1;c=4
技術分享圖片

TCL的數組有點向python的字典,數組下標可以是任意字符串。

set day(monday) 1
set day(tuesday) 2
set b $day(monday);#b=1

unset刪除變量

unset a b day

5,表達式
TCL支持和C語言類似的運算符,和C類似的操作數,0777//八進制,0xff//16進制,8e10//8的10次方,和C語言一樣,TCL也內置了很多數學函數。

6,列表list

列表是TCL重要的數據結構。list表示一堆元素的集合,元素可以是任意字符,包括list。

{}
{1 2 3 4 5}
{1 23 3 {4 5}}

1)list使用list命令生成列表,list 1 2 3 4

2)使用concat list list...合並兩個或多個列表

3)lindex list index 返回list第index個元素,從0開始計算。

4)llength list 返回list的元素個數

5)linsert list index value value...返回新list,新list是把所有value插入到list第index個元素之前

6)lreplace list first last value value...返回新list,把list第first個到last個元素用value參數替換,沒有value參數則表示刪除。

7)lrange list first last 返回list第first到last個元素組成的串。last 為end則返回到串末

8)lappend varname value value 把每個value附加到varname後面。

9)lsearch -exact -glob -regexp list pattern 返回第一個匹配的元素索引,找不到則返回-1。-exact、-glob、-regexp是可選的3中模式匹配技術。

-exact表示精確匹配;-glob和string match命令的匹配方式相同,-regexp表示正規表達式匹配。

10)lsort options list 對list排序,通過options指定排序方式,有-ascii:缺省方式,按照ASCII字符順序排序,-dictionary,按照字典順序,字典順序不考慮大小寫,數字被當做整數排序。-integer,將list元素轉換成整數,按照整數排序,-real,轉換成浮點數排序;-increasing升序,-decreasing降序。-command cmd 按照cmd命令對元素一一比較後給出排序結果。

11)split string splitchar 按照splitchar對string進行分割,返回分割後的list

12)join list joinstring 將list元素合並到字符串,中間以joinstring分開,缺省joinstring為空格。

7,控制流

和c語言類似,支持常見的控制流,if,switch,while,for,foreach。foreach 可以對list進行很好的遍歷。

技術分享圖片
if {$x>0}{
    do_something;
}elseif{$x==0} {

...
}else{
    do_anotherthing;
}
    
技術分享圖片

使用{}對語句塊進行分割以及條件表達式測試,第一行最後的{必須放在上一行,否則TCL會認為if命令已經結束,而將行首的{當做命令從而導致錯誤。

‘if {$x>0}‘if與{間有空格。

switch options string {pattern body pattern body} //options可以指定匹配方式-exact,-glob(default),-regexp

技術分享圖片
switch $x {
a -
b {incr t1}
c {incr t2}
default {incr t3}
}
技術分享圖片

while test body

技術分享圖片
set i [expr [llength $a] -1]
while { $i>=0}{
lappend b [lindex $a $i]
incr i -1
} 
技術分享圖片

for init test reinit body

for {set i [expr [llength $a] -1]} {$i>=0} {incr i -1} {
lappend b [lindex $a $i] }

foreach varnem list body

set x {}
foreach {i j} {a b c d e f} {
lappend x $j $i
} 

和C類似,TCL提供了break,continue命令用於跳出循環。
source命令,TCL提供source命令來調用和執行其他的tcl腳本,source /home/xxx/scripts/scripts1001.tcl

8,函數定義

TCL使用過程proc來進行C類似的函數定義,使用proc可以實現一些自定義的命令,其用法和內置命令一樣。

proc add {x y } {expr $x+$y}
add 1 2 ;# result is 3

proc內部可以使用global聲明一個全局變量,即該變量在proc體外定義,聲明global後,可以在proc內部對全局變量進行訪問。
應用upvar,使用upvar實現對一個變量的引用,upvar othervar myvar,一旦實現引用的綁定,對myvar的修改都將對應到othervar上去。

【轉】TCL語法簡介