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.

 

 

 

原文地址:https://www.cnblogs.com/sgtb/p/3685761.html