2008年8月27日 星期三

Tcl 語法

一開始可以先參考這裡:TCL 簡介
書簽:
[變數(variable)和變數替換(variable substituion)][表示式(expressions)][指令替換(command substitution)][流程控制(control flow)][程序(procedures)][陣列(arrays)][字串(strings)][輸出(output)]

key words:$、set、puts、expr、ns、if、elseif、else、incr、foreach、while、switch、proc、global

因為ns2的劇本是由tcl語法寫成的~所以,我們要先了解tcl語法如何使用~

因為沒有時間,
下面的網頁就寫的很清楚了,所以,大部分還是去參考下面的網頁吧~若以後,我有空再補吧~
我只寫出我遇到的問題~

;#
上面兩個聯合符號是表示後面的東西就是註解

[變數(variable)和變數替換(variable substituion)]

[表示式(expressions)]

[指令替換(command substitution)]

[流程控制(control flow)]
寫完範例後,竟然出現:「extra characters after close-brace while executing...」
因為在tcl語法中:
if {$value > 10}{
要改成: if {$value > 10} {
也就是if {}空一格{}
也就是說:
{左邊一定要存在一個空格
}右邊一定要存在一個空格

而且不能用

if {...}
{
  // do something
}

必需要用

if {...} {
  // do something
}


[程序(procedures)]:應該就是副程式的意思啦~
宣告
proc name {params1 params2 } {
  body
}
其中name為程序的名稱,params是參數列表,body則是程序的主體
例:

proc sum_proc {a b} {
  global myglobalvar
  puts "The value of the global variable is $myglobalvar"
  return [expr $a + $b]
}


呼叫
name param1 param2
例:

set myglobalvar 79
set sum [sum_proc $num1 $num2]

說明:
這裡的中括號表示是先運算中括號裡面的值,中括號裡面運算出來是2,則再執行set sum 2這一行指令

這個範例主要在說明區域變數(local variable)和全域變數(global variable)的觀念。這樣要特別說明的是當程序中有需要用到程序外已經定義好的變數前,必需先使用global這個保留字做宣告,才能存取程序外已經定義好的變數。

[陣列(arrays)]


set myarray(0) "Zero"
set myarray(1) "One"
set myarray(2) "Two"
for {set i 0} {$i < 3} {incr i 1} {
  puts $myarray($i)
}

這裡的陣列是用小括號來包住引數

ex6_2.tcl

set person_info(name) "Fred Smith"
set person_info(age) "25"
set person_info(occupation) "Plumber"
foreach thing {name age occupation} {
  puts "$thing == $person_info($thing)"
}

foreach thing{name age occupation}就是把它想成
set thing name;
set thing age;
set thing occupation;
分三個階段設定

ex6_3.tcl

set person_info(name) "Fred Smith"
set person_info(age) "25"
set person_info(occupation) "Plumber"
foreach thing [array names person_info] {
  puts "$thing == $person_info($thing)"
}

第一個loop時,$thing為name;而後面的就變成$person_info(name)也就是"Fred Smith"
第二個loop時,$thing為age;而後面的就變成$person_info(age)也就是"25"
第三個loop時,$thing為occupation;而後面的就變成$person_info(occupation)也就是"Plumber"

這個範例跟6.2最大的不同是在foreach這個迴圈,在6.2中,陣列中每個元素存放的位置必須一一列出,才能秀出陣列中每個元素的值,但是在這個範例,使用了[array names 矩陣名稱](注意是中括號喔~),使用的這樣的方法就可以列出person_info中的name、age、occupation,這個在元素很多的時候特別好用。而這裡的thing代表陣列的引數。

[字串特殊函數(strings function)]
ex7_1.tcl

set str "This is a string"
puts "The string is: $str"
puts "The length of the string is: [string length $str]"
puts "The character at index 3 is: [string index $str 3]"
puts "The characters from index 4 through 8 are: [string range $str 4 8]"
puts "The index of the first occurrence of letter \"i\" is: [string first i $str]"

說明:
[string length $str]可以用來顯示字串長度
[string index $str 3]可以用來顯示字串中的第四個字母為何(第一個字母的index為0)
[string range $str 4 8]可以用顯示從字串中第五個到第九個的字母
[string first i $str]可以用來顯示字母i在字串中第一次出現時的index值,也就是第一次出現時在第(index+1)個位置。

[輸出(output)]
ex8_1.tcl

set f [open "/tmp/myfile" "w"]
puts $f "We live in Texas. It's already 110 degrees out here."
puts $f "456"
close $f


執行的結果:
請使用文字編輯器打開/tmp/myfile,其內容為:

We live in Texas. It's already 110 degrees out here.
456

說明:
一般來說,puts若是沒有指定輸出裝置的話,內定的輸出裝置是螢幕,但此範例中有指定輸出的裝置為檔案,所以會把要秀出的字串寫入檔案内。

參考網頁:
TCL 簡介

沒有留言: