1. 程式人生 > >TCL指令碼語言詳解

TCL指令碼語言詳解

語言簡介

        TCL是一種很通用的指令碼語言,功能強大。最早稱為“工具命令語言”"Tool Command Language",但是目前已經不是這個含義,不過我們仍然稱呼它TCL,發音為"tickle”。TCL經常被用於快速原型開發,指令碼程式設計,GUI和測試等方面。

實際上包含了兩個部分:一個語言和一個庫。首先,Tcl是一種簡單的指令碼語言,主要使用於釋出命令給一些互交程式如文字編輯器、偵錯程式和shell它有一個簡單的語法和很強可擴充性,Tcl可以建立新的過程以增強其內建命令的能力。其次,Tcl是一個庫包,可以被嵌入應用程式,Tcl的庫包含了一個分析器、用於執行內建命令的例程和可以使你擴充(定義新的過程)的庫函式。

應用程式可以產生Tcl命令並執行,命令可以由使用者產生,也可以從使用者介面的一個輸入中讀取(按鈕或選單等)。但Tcl庫收到命令後將它分解並執行內建的命令,經常會產生遞迴的呼叫。

Tcl資料型別簡單。對Tcl來說,它要處理的資料只有一種——字串。Tcl將變數值以字串的形式進行儲存,不關心它的實際使用型別。內嵌的Tktoolkit)圖形工具可以提供簡單而又豐富的圖形功能,讓使用者可以輕鬆的建立簡單的圖形介面。

Tcl的執行是互動式的,Tcl提供了互動式命令介面,介面有兩種:tclsh和wish。tclsh只支援Tcl命令,wish支援Tcl和Tk命令。通過互動介面,我們就可以象執行UNIX shell命令一樣,逐條命令執行,並即時得到執行結果。

Tcl/Tk可以提供跨平臺的支援。Tcl語言可以運行於絕大多數當今流行的UNIX、WINDOWS和Macintosh等系統上,而且命令通用,只是啟動的細節有些不同。

基本語法

1、命令結構:commandName arguments每條命令之間通過換行或者;隔開。例如:

set foo 0

set bar 1;

2、註釋:使用#註釋,不過要注意的是下面的註釋是錯誤的:

set foo0 #這個是註釋(錯誤)

因為tcl解析器總是認為一條命令應該以換行或者分號結束,其他的在同一行中都認為是引數。所以正確的應該是:

set foo 0;  #這個是註釋

其實對於習慣於編譯型程式語言的人來說每行末尾加個;應該是理所當然的事情,所以這個對我們應該沒有什麼不習慣的。

3、資料型別:tcl不支援其他語言中的形如int, double ,char等等型別,唯一支援的就是string型別。也就是說一個變數可以在不同的時刻理解為不同的型別。

4、變數:tcl可以定義兩種型別的變數,變數和陣列。

變數:在tcl變數不需要宣告就可以直接賦值。給變數賦值的例子:

set ba 1;

set ma “qian lifeng”; #加引號的作用是為了告訴編譯器包括空格

取得變數的值可以在對應的變數名前面加$來取得,例如:

puts $ba;  #表示打印出ba的值

陣列:陣列也不需要宣告,直接賦值,例如:

set qian(0) 1;

set qian(1) 2;

一個比較有意思的地方是陣列下標可以不按照順序來寫,也不一定是數字,可以是字串。例如:

set qian(123) f;

set qian(6789)fs;

set qian(good)yes;

我們可以使用puts $qian(123); 的形式來獲得陣列的內容。當然tcl陣列也支援多維陣列,宣告形式為:

setqian(1,1,1,1,1) fs; #隨便多少維

如果我們要檢視某個已經賦值的陣列的資訊,可以使用parray命令:如:

parray qian;   #將打印出qian陣列的所有資訊

5、字串操作:string 命令基本語法如下(這裡的string1,string2可以是字串也可以是變數,option是下列選項之一)。

stringoption string1 string2;

option的操作選項:

compare按照字典的排序方式進行比較。根據string1 <, =, >string2分別返回-1, 0, 1

first返回string2中第一次出現string1的位置,如果沒有出現string1則返回-1

lastfirst相反

trimstring1中刪除開頭和結尾的出現在string2中的字元

tolower返回string1中的所有字元被轉換為小寫字元後的新字串

toupper返回string1中的所有字串轉換為大寫後的字串

length返回string1的長度

例子:

string length$qian;  #將返回變數qian的長度

6、數字操作:因為tcl中只有一個string型別的變數,所以當要運算元字進行運算的時候,tcl提供了increxpr兩個運算元。

incr的基本用法為:

incrvariable integervariable必須為數字)

例如我要將一個數字加3

set a 3;

incr a 3;  #將a加3,如果要減3,則為 incr a–3;

預設的incr a等同於a++的意思,即本身自增1。

expr的基本語法為:

expr functionnumber

expr是為了提供更加複雜的操作而設計的一個語法,比如運算乘除法等等。在執行算術操作的時候必須將expr命令放在算術操作之前。例如:

set a 20; set b4;

set c [expr$a/$b];  #此時的c的值為5

除此之外,expr還能夠識別一些函式及其返回值如下:

abs(x) x的絕對值

round(x) x舍入後得到的整數值

sin(x) x的正弦

…………………………………..

舉個例子:

set a [exprsin(0.3)]; #計算0.3的正弦

7、轉義

在tcl中可以使用{}將需要轉義的字串括起來。例如:

set a 5;

set b {$a};  #此時b的值為”$a“,而不是5。

8、流控制

if控制流,基本語法:

if { 表示式 } {

            #運算;

} else {

             #其他運算;

}

需要注意的是if.else, if……elseif…中的elseelseif必須要和if的後面一個{在同一行。

switch控制流:基本語法:

switch $x {

           數值1 { 操作1 ;}

數值2 { 操作2 ;}

}

9、迴圈

tcl提供三種迴圈命令,分別為:forforeachwhile此外tcl還提供兩個迴圈控制命令。注意:這個三個命令中的程式塊的開始花括號必須要和三個命令同一行。

1while基本語法:while {條件} { 程式塊 }

2foreach將在一組變元中進行迴圈,並且每次都將執行他的迴圈體。基本結構:  foreachvariable {items} {block}

這裡的variable是變數的名字,便於block中使用。舉例:

foreach element{0 m n b v} {

switch$element {

# 判斷element的值

             }

}

3for是最常用的迴圈。其基本結構為:for{initialization} {condition} {increment} {body}

例如:for {set i 0} {$i< 10} {incr i} {puts $i;}  #將打印出0到9

程式示例

# add a member function call "greet"
Class mom
mom instproc greet {} {
         $selfinstvar age_
         puts"$age_ year old mom say: How are you doing?"
}
 
# Create a child class of "mom" called"kid"
# and overide the member function "greet"
Class kid -superclass mom
kid instproc greet {} {
         $selfinstvar age_
         puts"$age_ year old kid say: What's up, dude?"
}
 
# Create a mom and a kid object, set each age
set a [new mom]
$a set age_ 45
set b [new kid]
$b set age_ 15
 
# Calling member function "greet" of eachobject
$a greet
$b greet