TCL入门小记
因为个人原来在一家公司用过TCL做过自动化测试工具,所以就进入了软件测试这个行业。现在就简单介绍一下TCL的相关知识,希望能引导大家入门,有机会用的话可以一起沟通和探讨,互相进步,希望通过这个平台的交流,我们各位的专业水平和素养能够得到一定的提升,同时我也很感谢各位同学的参与和分享。
1.什么是TCL
TCL全称是Tool Command Language的缩写,它是一个基于字符串的命令语言,基础结构和语法比较简单,很容易掌握。
2.下面列举一些示例,让大家了解一下TCL的概貌,希望能和大家共勉
变量和变量交换
不像c,Tcl的变量在使用前不需要声明。Tcl的变量在它首次被赋值时产生,使用set命令。变量可以用unset命令删除,虽然并不强制需要这样做。变量的值通过$符号访问,也叫变量交换。Tcl是一个典型的”弱类型定义”语言,这意味者任何类型可以存储在任何变量中。例如,同一个变量可以存储数字,日期,字符串甚至另一段Tcl script.Example 1.1:
set foo "john"
puts "Hi my name is $foo"
Output: Hi my name is john
Example 1.2:
set month 2
set day 3
set year 97
set date "$month:$day:$year"
puts $date
Output: 2:3:97
Example 1.3:
set foo "puts hi"
eval $foo
Output: hi
在这个例子里,变量foo存储了另外一段Tcl script.表达式包括数学表达式,关系表达式,通常用 expr命令。
Example 2.1:
expr 0 == 1 Output: 0
Example 2.2:
expr 1 == 1 Output: 1
两数比较,true则输出1,false输出0
Example 2.3:
expr 4 + 5 Output: 9
Example 2.4:
expr sin(2) Output: 0.909297
命令传递以运算结果替代Tcl命令中的部分
Example 3.1:
puts "I am [expr 10 * 2] years old, and my I.Q. is [expr 100 - 25]"
Output: I am 20 years old, and my I.Q. is 75
方括号是命令传递的标志
Example 3.2:
set my_height 6.0
puts "If I was 2 inches taller, I would be [expr $my_height + (2.0 / 12.0)] feet tall"
Output: If I was 2 inches taller, I would be 6.16667 feet tall
命令流控制
Tcl有判断流转(if-else; switch)和循环控制(while; for; foreach)
Example 4.1:
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." }
Example 4.2:
set num_legs 4
switch $num_legs
{
2 {puts "It could be a human."}
4 {puts "It could be a cow."}
6 {puts "It could be an ant."}
8 {puts "It could be a spider."}
default {puts "It could be anything."}
}
Output: It could be a cow.
Example 4.3:
for {set i 0} {$i < 10} {incr i 1}
{ puts "In the for loop, and i == $i"}
Output: In the for loop, and i == 0
In the for loop, and i == 1
In the for loop, and i == 2
In the for loop, and i == 3
In the for loop, and i == 4
In the for loop, and i == 5
In the for loop, and i == 6
In the for loop, and i == 7
In the for loop, and i == 8
In the for loop, and i == 9
Example 4.4:
set i 0
while {$i < 10}
{ puts "In the while loop, and i == $i" incr i 1}
Output: In the while loop, and i == 0
In the while loop, and i == 1
In the while loop, and i == 2
In the while loop, and i == 3
In the while loop, and i == 4
In the while loop, and i == 5
In the while loop, and i == 6
In the while loop, and i == 7
In the while loop, and i == 8
In the while loop, and i == 9
Example 4.5:
foreach vowel {a e i o u} { puts "$vowel is a vowel"}
Output:
a is a vowel
e is a vowel
i is a vowel
o is a vowel
u is a vowel
Procedures
Tcl的Procedures 和c的函数差不多. 它们有参数,它们返回值。基本定义方法是:proc name argList body当一个procedure被定义,它就被看做是一个命令,如同Tcl的自带命令一样,通过名字来呼叫,名字后面跟上参数。缺省的,procedure的返回值是它的最后一个命令结果。但也可以通过return命令来返回其他值。Return值可以在procedure的任何地方,一旦执行,procedure就此返回。
Example 5.1:
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]"
Output: The sum is 26
The magnitude of 3 is 3
The magnitude of -2 is 2
在procedure中可以通过set创造变量,但是变量只在procedure中有效,而且一旦procedure返回,这些变量就不可访问。如果procedure需要访问主程序中的变量,就需要使用global关键字。
Example 5.2:
proc dumb_proc {}
{ set myvar 4
puts "The value of the local variable is $myvar"
global myglobalvar
puts "The value of the global variable is $myglobalvar"
}
set myglobalvar 79
dumb_proc
Output:
The value of the local variable is 4
The value of the global variable is 79
Lists
Lists就好像是Tcl中的一种特殊的数组。它吧一堆东西放成一个集合,然后就像操作一个整体一样的操作它。
Example 6.1:
set simple_list "John Joe Mary Susan"
puts [lindex $simple_list 0]
puts [lindex $simple_list 2]
Output:
John
Mary
注意list的index是从0开始的
Example 6.2:
set simple_list2 "Mike Sam Heather Jennifer"
set compound_list [list $simple_list $simple_list2]
puts $compound_list
puts [llength $compound_list]
Output:
{John Joe Mary Susan}
{Mike Sam Heather Jennifer}
2
Example 6.3:
set mylist "Mercury Venus Mars"
puts $mylist
set mylist [linsert $mylist 2 Earth]puts $mylist
lappend mylist Jupiter
puts $mylist
Output:
Mercury Venus Mars
Mercury Venus Earth Mars
Mercury Venus Earth Mars Jupiter
Arrays
Tcl数组在使用前无须定义,大小也不用指定。
Example 7.1:
set myarray(0) "Zero"
set myarray(1) "One"
set myarray(2) "Two"
for {set i 0} {$i < 3} {incr i 1}
{ puts $myarray($i)}
Output:
Zero
One
Two
Example 7.2:
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)"
}
Output:
name == Fred
Smithage == 25
occupation == Plumber
这个例子指出数组的index不需要是数字,其他类型的数据也可以。
Example 7.3:
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)"}
Output:
occupation == Plumber
age == 25
name == Fred Smith
Strings
字符串是Tcl中最常用的类型,string有很多使用参数,可以参照Tcl手册。
使用方法:string option arg arg ...
Example 8.1:
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]"
Output:
The string is: This is a string
The length of the string is: 16
The character at index 3 is: s
The characters from index 4 through 8 are: is a
The index of the first occurrence of letter "i" is: 2
eval 调用一个Tcl脚本
eval命令会把它的参数直接送往解释器。
Example 9.1:
set foo "set a 22"
eval $foo
puts $a
Output:
22
单纯的执行$foo不会成功。
catch
在实际应用中,如果一条命令或函数使用了错误的错误的参数和自身出现错误,它就会终止当前的执行,或弹出报错信息,catch就用来捕获这种错误。
Example 9.2:
set retval [catch {set f [open "nosuchfile" "r"]}]
if {$retval == 1}
{ puts "An error occured"}
Output:
(this output occurs if there is no file named "nosuchfile" in the current directory).An error occuredCatch 参数记录一个script的执行情况,如果返回值为1,则执行出错。用来进行错误处理。
总结:上面介绍了TCL的一些基本的语法内容,大家碰到这种语言也就有大致的了解,至少能读懂大致的含义,当然如果要深入的话,还有不少的知识需要学习和分享,有兴趣的同学可以找相关资料深入一下。
Edit by Hamson.