TCL (Tool Command Language)在ns2中主要是用来描述脚本的,简单的说就是用来描述要仿真的网络环境和参数设定等。在练习底下的范例时,先把程序代码存放到档案内,然后使用ns去执行即可(ns也具有tcl interpreter的功能)。
Tcl只支持一种数据结构:字符串(string),所有的参数、命令的结果以及所有的变量都是字符串。字符串有三种形式:命令(command),表达式(experesion),列表(list)。一个参数可以由 “ ” 双引号来表示,命令的子域可由 [ ] 方括号进行命令子替代。
注释和shell很相像,第一个字母是 # 的tcl字符串是注释,用 $ 进行变量替换,即变量的引用。
[变量(variable)和变量替换(variable substituion)]
Example 1:
set foo “john”
puts “my name is $foo”
说明:
程序第一行:把”john”这个字符串指派给变量foo。程序的第二行:使用puts这个指令把后面的字符串秀出来,而在秀出来之前,会先把$foo先取代成john,所以真正被秀出来的字符串是my name is john。
[表示式(expressions)]
Example 2:
set value [expr 0==1]
puts $value
说明:
在范例中使用了expr去判断0是否等于1,结果是假,所以把0存到value这个变量中,最后并把结果秀出来。
[指令替换(command substitution)]
就如同变量替换一样,指令替换可以把”原tcl script执行结果”取代”原tcl script”。
Example 3:
puts "I am [expr 10 * 2] years old, and my I.Q. is [expr 100 - 25]"
说明:
在范例中,square bracket(也就是[])可以用来达成指令替换,所以在执行此行tcl script时,会先去执行[expr 10*2]和[expr 100-25]并把结果20和75取代原本tcl script中[expr 10*2]和[expr 100-25]的位置,最后在使用puts把此字符串秀出来。
[流程控制(control flow)]
跟其它的程序相同,TCL也提功了一些方法可以用来控制程序运作的流程,这包含了if-else、switch、while、for、foreach等指令,这些指令用来请参考下面范例。
Example 4:
set my_planet "earth"
if {$my_planet == "earth"} {
puts "I feel right at home."
} elseif {$my_planet == "venus"} {
puts "This is not my home."
} else {
puts "I am neither from Earth, nor from Venus."
}
set temp 95
if {$temp < 80} {
puts "It's a little chilly."
} else {
puts "Warm enough for me."
}
[程序(procedures)]
在TCL中也允许使用者去自定程序,定义程序基本的语法为: proc name params body,其中name为程序的名称,params是参数列表,body则是程序的主体。定义完程序后就可以像任何其它的tcl指令一样执行。
Example 5:
proc sum_proc {a b} {
return [expr $a + $b]
}
proc magnitude {num} {
if {$num > 0} {
return $num
}
set num [expr $num * (-1)]
return $num
}
set num1 12
set num2 14
set sum [sum_proc $num1 $num2]
puts "The sum is $sum"
puts "The magnitude of 3 is [magnitude 3]"
puts "The magnitude of -2 is [magnitude -2]"
说明:
在程序中定义了两个程序sum_proc和magnitude,sum_proc有两个输入参数a和b,这个程序最主要的工作就是把a和b相加,并把结果回传,另外一个程序magnitude只有一个参数num,这个程序最主要就是去判断num是否是正数或负数,若是正数则直接回传,若是负数就先与-1相乘,再回传,简单的说magnitude就是在做绝对值。
[数组(arrays)]
Example 6:
set myarray(0) "Zero"
set myarray(1) "One"
set myarray(2) "Two"
for {set i 0} {$i < 3} {incr i 1} {
puts $myarray($i)
}
说明:
程序一开始定义了一个数组,名称为myarray,共有三个元素(element),第一个为”Zero”,存放在数组中0的位置;第一个为”One”,存放在数组中1的位置,第一个为”Two”,存放在数组中2的位置,程序最后是把数组每个元素都秀出来。
[字符串(strings)]
Example 7:
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)]
Example 8:
set f [open "/tmp/myfile" "w"]
puts $f "We live in Texas. It's already 110 degrees out here."
puts $f "456"
close $f
说明:
一般来说,puts若是没有指定输出装置的话,内定的输出装置是屏幕,但此范例中有指定输出的装置为档案,所以会把要秀出的字符串写入档案内。