[TCL] 基本語法與指令 - 2. TCL 語法
TCL Script 可視為一個包含許多 TCL 指令 (TCL command) 的程式,一個 TCL 指令的基本語法為:
變數
TCL 變數的可以隨時建立不用事先宣告,變數名稱的取法也沒有任何限制,所以可以使用任何字元來為變數命名,甚至變數名跟指令名稱相同也沒問題。使用時只有一點要注意的,就是 TCL 是大小寫有別的語言。通常,我們以 set 指令來設定變數值:
TCL 的 set 指令除了設定變數值的用途外,也可以用來取出變數的內容,如上列程式最後一行使用 set 指令取出 PI的值 (注意!這邊不用在變數名稱前加上 $ 符號)。
unset 指令用來刪除一個或多個變數,來釋放記憶體空間:
我們可以使用 info exists 指令來檢查變數是否存在。例如 incr 指令使用時,變數必須先建立才能為變數進行加法運算。此時便可使用 info exists 先檢驗變數的存在:
TCL 在執行時會建立一些全域變數,可以利用 info global 列出有哪些全域變數:
其中幾個比較常用的,像是 argc 存放程式的命令列參數個數,argv0 是目前執行的 TCL Script 名稱,argv 則是存放所有命令列參數的list;env 陣列存放系統的環境變數,而tcl_version 會告訴你目前的 TCL 版本為何。
置換與群組處理 (Substitution and Grouping)
底下是 TCL 置換處理與群組的幾點規則整理:
TCL 的數學運算子
command arg1 arg2 arg3 ….
- 在 TCL 語言中,每行指令的第一個單字為指令名稱
- 空白字元用來分隔指令名稱與各個個別的參數
- 個別指令的分隔是以分號與換行符號作為分隔符號
- 一個參數如果超過一個英文單字 (亦即字串中間穿插空白或其它符號),可用雙引號與大括號將這些元素組成 (grouping) 單一一個參數。使用雙引號與大括號的差別,在於TCL針對雙引號中的字串會做置換處理 (substitution),例如變數值的代換或是執行包含於字串中的 TCL 指令(使用中括號來表示),而對於大括號所括住的內容 TCL則不會有這些置換處理。
# Demo1.tcl
puts stdout one; puts stdout two
set x 4
set y 6
puts "$x + $y = [expr $x + $y]"
puts {$x + $y = [expr $x + $y]}
puts "Hello\n\nTCL!"
% ./Demo1.tcl
one
two
4 + 6 = 10
$x + $y = [expr $x + $y]
Hello
TCL!
下表所列的符號在 TCL 語言裏有特殊的意義:置換符號 (substitution symbols) | |
$ | 變數值置換符號。$ 符號用來取出指定變數的值。底下利用 set 指令設定 x 變數的值,並用 puts 指令輸出 x 的內容到 Console:
如上列最後一行程式碼,取出變數值時需在變數名稱前加上 $ 符號。 |
[ ] | 命令置換符號。TCL 將中括號中的內容視為一個指令,會執行其中的指令並將結果傳回。例如 Demo1.tcl L5:puts "$x + $y = [expr $x + $y]" 在做完 x 與 y 兩個變數的置換後,TCL解譯器遇到中括號認為其中為另一個可執行的指令,指令名稱為 expr。在執行 expr指令前,TCL 先將 x 與 y 值置換後,傳遞給 expr 指令並呼叫執行之。expr 指令用來做數學式子的運算,會負責剖析參數並做數學運算。 |
群組 (grouping symbols) | |
“” | 雙引號可將多個元素組成單一一個參數,引號內的內容會被 TCL 進行置換處理,包括變數置換與命令置換。 |
{ } | 大括號的功能與雙引號相同,但 TCL 不會對括號中的內容做任何解釋或處理,會照將括號中的內容視為一個參數,照本宣科原原本本地傳遞給指令去處理。例如 Demo1.tcl L6:puts {$x + $y = [expr $x + $y]} 因為 TCL 對大括號中的內容不做任何處理,因此它的輸出為 $x + $y = [expr $x + $y]。另外,TCL 不會將大括號中的換行符號視為一個指令的結束,如果一個指令的參數很長時,我們就可以利用大括號這樣寫,把換行符號當成是參數的一部份: puts {$x + $y = [expr $x + $y ]} |
其它 | |
\ | 和 C base 語言一樣,反斜線可將特殊的字元做跳脫處理。例如 \n 代表換行符號。在 TCL 語言裏,如果一個指令超過一行,亦可在行尾使用反斜線做為續行的符號 (VB 指令如果超過一行,則是在行尾用底線符號代表續行)。 |
分號與換行號 | 代表一個 TCL 指令的結束符號。 |
# | 註解符號。通常我們會在一行程式碼的第一個字元打上 # 符號,以代表本行程式為註解。注意!如果在 # 符號前有 TCL 指令,必須像這樣做:puts hello ;# here is comment 亦即,在 # 符號前加上一個分號代表前面指令的結束。如果不這麼做,那TCL 便會把 # 視為一個參數丟給 puts指令去做處理。 |
變數
TCL 變數的可以隨時建立不用事先宣告,變數名稱的取法也沒有任何限制,所以可以使用任何字元來為變數命名,甚至變數名跟指令名稱相同也沒問題。使用時只有一點要注意的,就是 TCL 是大小寫有別的語言。通常,我們以 set 指令來設定變數值:
set x 5
set y 6
set PI 3.14
set PI*2 6.28 ;# 注意!變數名稱是 PI*2
puts $PI*2
set PI
TCL 的 set 指令除了設定變數值的用途外,也可以用來取出變數的內容,如上列程式最後一行使用 set 指令取出 PI的值 (注意!這邊不用在變數名稱前加上 $ 符號)。
unset 指令用來刪除一個或多個變數,來釋放記憶體空間:
unset x y PI
我們可以使用 info exists 指令來檢查變數是否存在。例如 incr 指令使用時,變數必須先建立才能為變數進行加法運算。此時便可使用 info exists 先檢驗變數的存在:
if {![info exists counter]} {
set counter 0
} else {
incr counter ;# counter 加 1
}
TCL 在執行時會建立一些全域變數,可以利用 info global 列出有哪些全域變數:
% info global
argv argv0 tcl_version tcl_interactive var auto_oldpath errorCode auto_path errorInfo unknown_handlers unknown_handler_order auto_index env tcl_patchLevel argc tcl_libPath _ tcl_platform tcl_library
其中幾個比較常用的,像是 argc 存放程式的命令列參數個數,argv0 是目前執行的 TCL Script 名稱,argv 則是存放所有命令列參數的list;env 陣列存放系統的環境變數,而tcl_version 會告訴你目前的 TCL 版本為何。
置換與群組處理 (Substitution and Grouping)
底下是 TCL 置換處理與群組的幾點規則整理:
- TCL 指令的參數是以空白字元分隔,可以使用雙引號或大括號將多個元素組成一個參數。
- 如果是以大括號組出一個參數,TCL 不會對括住的內容進行任何置換,在對應的結束大括號出現前,任何字元都將視為參數的一部份,包含換行符號、分號或是內部巢狀的大括號。
- 如果是以雙引號組出一個參數,則在對應的結束雙引號出現前,雙引號中的內容會被 TCL 進行置換動作。
- 如果參數或是雙引號內的單字是以變數符號 $ 為開頭,則 TCL 為會進行變數的置換。
- 如果參數或是雙引號中有中括號,則在對應的中括號出現前,TCL 會對中括號中的內容進行指令的置換。
- 因為 TCL 是以空白字元作為參數分隔符號,因此要避免下列的錯誤:
if {$x > 1}{puts $x}
^ 在此加上一個空白字元,隔開 if 指令的第二及第三個參數。
TCL 的數學運算子
- ~ ! | 「減號(Unary minus)」 / 「NOT位元運算(Bit-wise not)」 / 「NOT布林邏輯運算(Logical not)」。這些運算不可以用來操作字串(string)運算元,而且「NOT位元運算」只限於整數的操作。 |
* / % | 「乘(Multiply)」 / 「除(divide)」 / 「餘數(remainder)」。 這些運算不可以用來操作字串(string)運算元,而且「餘數」運算只限於整數的操作。 |
+ - | 「加(Add)」與「減(subtract)」。限用於數值運算元。 |
<< >> | 「左右移位運算 (Shift Left / Right)」。運算只限於整數的操作。 |
< > <= >= |
布林運算「小於(less)」/「大於(greater)」/「小於等於(less than or equal)」/「大於等於(greater than or equal)」。如果條件成立這些運算子會產生「1」的結果,否則產生「0」。 |
== != |
布林運算「等於(equal)」/「不等於(not equal)」。每個運算會產生0/1的結果。可適用於任何運算元。 |
& | 「AND位元運算(Bit-wise and)」。限於整數的操作。 |
^ | 「XOR位元運算(Bit-wise exclusive or)。限於整數的操作。 |
| | 「OR位元運算(Bit-wise or)。限於整數的操作。 |
&& | 「AND布林邏輯運算(Logical and)」。如果參與的兩個運算元都非零的話會得到1的結果,否則的話會得到0。 限用於數值運算元(不限整數或小數)。 |
|| | 「OR布林邏輯運算(Logical or)」。如果參與的兩個運算元都是零的話會得到0的結果,否則的話會得到1。 限用於數值運算元(不限整數或小數)。 |
x ? y : z | 如果 x 為真時傳回 y 否則傳回 z |
相關系列文章:
留言
張貼留言