SayCoo論壇

查看: 14021|回復: 0
打印 上一主題 下一主題

TCL 語法

  [複製鏈接]
跳轉到指定樓層
1
發表於 2007-1-2 21:34:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
命令格式在Tcl裡每一條直譯器可以理解的"命令"加"參數"型式,它的語法模型很簡單,通常是一個命令後面加好幾個參數,如:
  
  命令 [參數 1] [參數 2] [參數 3] [參數 4] ...... [參數 N]
  • 空白字元用來分隔指令名稱與各個參數。
  • 個別指令的分隔是以分號i或換行符號來作為分隔符號。
  • 在 Tcl 裡有區分英文字母大小寫。
以下為 Tcl 語法裡的一些特殊符號和意義:
  • 置換符號 (substitution symbols)
    • $  (變數值置換符號):
              $ 符號用來取出指定變數的值。底下利用 set 指令設定 x 變數的值,並用 puts 指令輸出 x 的內容:
              程式內容(下載):
              
      set x 5
                    puts stdout $x
              執行結果:
              
      JYL@JYLDesktop ~
                    $tclsh TclTk_0002_001.tcl
                    5
              如上列最後一行程式碼,取出變數值時需在變數名稱前加上 $ 符號。
    • [ ]  (命令置換符號):
              TCL 將中括號中的內容視為一個指令,會執行其中的指令並將結果傳回。如:
              程式內容(下載):        
      set x 5
                    set y 10
                    puts "$x + $y = [expr $x + $y]"
              執行結果:
              
      JYL@JYLDesktop ~
                    $tclsh TclTk_0002_002.tcl
                     5 + 10 = 15
      在做完 x 與 y 兩個變數的置換後,TCL解譯器遇到中括號認為其中有另一個可執行的指令,指令名稱為 expr。在執行 expr指令前,TCL先將 x 與 y 值置換後,傳遞給 expr 指令並呼叫執行之。expr 指令用來做數學式子的運算,會負責剖析參數並做數學運算。
      
  • 群組符號 (grouping symbols)
    • “”
              雙引號可將多個元素組成單一一個參數,引號內的內容會被 TCL 進行置換處理,包括變數置換與命令置換,如:
              程式內容(下載):        
      set x 5
                    set y 10
                    puts "$x + $y = [expr $x + $y]"
              執行結果:
              
      JYL@JYLDesktop ~
                    $tclsh TclTk_0002_002.tcl
                     5 + 10 = 15
    • { }
              大括號的功能與雙引號相同,但 TCL 不會對括號中的內容做任何解釋或處理,會將括號中的內容視為一個參數,照本宣科原原本本地傳遞給指令去處理。如:        程式內容(下載):        
      set x 5
                    set y 10
                    puts {$x + $y = [expr $x + $y]}
              執行結果:
              
      JYL@JYLDesktop ~
                    $tclsh TclTk_0002_003.tcl
                    $x + $y = [expr $x + $y]
      因為 TCL 對大括號中的內容不做任何處理,因此它的輸出為 $x + $y = [expr $x + $y]。另外,TCL不會將大括號中的換行符號視為一個指令的結束,如果一個指令的參數很長時,我們就可以利用大括號這樣寫,把換行符號當成是參數的一部份:
              程式內容(下載):        
      set x 5
                    set y 10
                    puts {$x + $y =
                    [expr $x
                    + $y ]
                    }
              執行結果:
              
      JYL@JYLDesktop ~
                    $tclsh TclTk_0002_004.tcl
                    $x + $y =
                    [expr $x
                    + $y]
      
  • 置換與群組處理 (Substitution and Grouping)規則整理:
    • TCL 指令的參數是以空白字元分隔,可以使用雙引號或大括號將多個元素組成一個參數。
    • 如果是以大括號組出一個參數,TCL 不會對括住的內容進行任何置換,在對應的結束大括號出現前,任何字元都將視為參數的一部份,包含換行符號、分號或是內部巢狀的大括號。
    • 如果是以雙引號組出一個參數,則在對應的結束雙引號出現前,雙引號中的內容會被 TCL 進行置換動作。
    • 如果參數或是雙引號內的單字是以變數符號 $ 為開頭,則 TCL 為會進行變數的置換。
    • 如果參數或是雙引號中有中括號,則在對應的中括號出現前,TCL 會對中括號中的內容進行指令的置換。
    • 因為 TCL 是以空白字元作為參數分隔符號,因此要避免下列的錯誤:
              if {$x > 1}{puts $x}
                           ^在此必需加上一個空白字元,以隔開 if 指令的第二及第三個參數。
      
  • 其它符號
    • \
              和 C base 語言一樣,反斜線可將特殊的字元做跳脫處理。例如 \n 代表換行符號。在 TCL 語言裏,如果一個指令超過一行,亦可在行尾使用反斜線做為續行的符號 (VB 指令如果超過一行,則是在行尾用底線符號代表續行)。
    • 分號與換行號
              代表一個 TCL 指令的結束符號。
    • #
              註解符號。通常我們會在一行程式碼的第一個字元打上 # 符號,以代表本行程式為註解。
              注意!如果在 # 符號前有 TCL 指令,必須像這樣做:
              
      puts hello ;# here is comment
              亦即,在 # 符號前加上一個分號代表前面指令的結束。如果不這麼做,那TCL 便會把 # 視為一個參數丟給 puts 指令去做處理。
      
變數Tcl使用弱定義型態的變數方式,它的特色包含如下:
  • 使用Tcl的變數時不用預先宣告變數的資料型態。
  • Tcl的在讀入輸入的程式時,預設所有的變數內容都是用"字串的型式"儲存,如:
        % set val1 12.3
        % set val2 "12.3"
        在這個例子中,Tcl會把 val1 和 val2 的內容看成是相等的,沒有數值和字串的差別。
在 Tcl 裡,變數名稱的取法也沒有任何限制,所以可以使用任何字元來為變數命名,甚至變數名跟指令名稱相同也沒問題。使用時只有一點要注意的,就是 TCL 是大小寫有別的語言。而 TCL 以 set 指令來設定變數值,如:
  • set x 5
  • set y 6
  • set PI 3.14
  • set PI*2 6.28 ;# 注意!變數名稱是 PI*2
unset 指令用來刪除一個或多個變數,來釋放記憶體空間,如:
  • unset x y PI
而TCL 的 set 指令除了設定變數值的用途外,也可以用來取出變數的內容,請先下指令 tclsh 進入 tcl 的直譯器,然後輸入下列指令:
JYL@JYLDesktop ~
      $tclsh
       %set pi 3.14 #設定變數 pi 的數值為 3.14
      3.14
       %set pi #取出變數 pi 的內容
      3.14
       %set pii #取出變數 pii 的內容,因為並沒有 pii 這個變數,因此會顯示:can't read "pii": no such variable
      can't read "pii": no such variable
       %
另外一個好用的指令為 info exists,我們可以使用 info exists 指令來檢查變數是否存在。例如在使用 incr 指令時,變數必須先建立才能為變數進行加法運算。此時便可使用 info exists 先檢驗變數的存在:
if {![info exists counter]} {
      set counter 0
      } else {
      incr counter ;# counter 加 1
      }
TCL 在執行時會建立一些全域變數,可以利用 info global 列出有哪些全域變數:
JYL@JYLDesktop ~
      $tclsh
      %info global
      tcl_rcFileName tcl_version argv argv0 tcl_interactive auto_oldpathauto_path errorCode errorInfo auto_index env tcl_patchLevel argctcl_libPath tcl_platform tcl_library
      %
請注意喔,這裡請先下指令tclsh進入tcl的直譯器,之後再下info global指令列出全域變數,以下為幾個比較常用的變數意義:
  • argc:存放程式的命令列參數個數。
  • argv0:目前執行的 TCL Script 名稱。
  • argv:存放所有命令列參數的list。
  • env:陣列存放系統的環境變數。
  • tcl_version:目前的 TCL 版本為何。
可以在退出 tcl 直譯器之後將以下程式碼存成 tcl 檔,然後執行此程式將以上的變數內容印出來,如:
  程式內容(下載):
puts "============start of some global variable============="
      puts "\$argc=$argc"
      puts "\$argv0=$argv0"
      puts "\$argv=$argv"
      puts "\$tcl_version=$tcl_version"
      puts "\$tcl_rcFileName=$tcl_rcFileName"
      puts "\$tcl_interactive=$tcl_interactive"
      puts "\$auto_path=$auto_path"
      puts "\$errorCode=$errorCode"
      puts "\$errorInfo=$errorInfo"
      puts "\$tcl_patchLevel=$tcl_patchLevel"
      puts "\$tcl_libPath=$tcl_libPath"
      puts "\$tcl_library=$tcl_library"
      puts "============start of some global variable============="
執行結果:
JYL@JYLDesktop ~
      $tclsh TclTk_0002_0005.tcl
      ============start of some global variable=============
      $argc=0
      $argv0=ns2_0002_005.tcl
      $argv=
      $tcl_version=8.4
      $tcl_rcFileName=~/tclshrc.tcl
      $tcl_interactive=0
      $auto_path=C:/cygwin/usr/share/tcl8.4 C:/cygwin/usr/share C:/cygwin/lib
      $errorCode=
      $errorInfo=
      $tcl_patchLevel=8.4.1
$tcl_libPath=C:/cygwin/share/tcl8.4 C:/cygwin/share/tcl8.4C:/cygwin/usr/share/tcl8.4 C:/share/tcl8.4 C:/cygwin/library C:/libraryC:/../tcl8.4.1/library
      $tcl_library=C:/cygwin/usr/share/tcl8.4
      ============start of some global variable=============
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。
您需要登錄後才可以回帖 登錄 | 加入會員

本版積分規則

手機版|黑名單|SayCoo論壇

GMT+8, 2024-4-20 04:25

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表