zoukankan      html  css  js  c++  java
  • 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.

     

     

     

  • 相关阅读:
    《算法竞赛入门经典》 例题35 生成元 (Digit Generator, ACM ICPC Seoul 2005,UVa)
    《算法竞赛入门经典》 例题35 生成元 (Digit Generator, ACM ICPC Seoul 2005,UVa)
    《算法竞赛入门经典》 例题35 生成元 (Digit Generator, ACM ICPC Seoul 2005,UVa)
    SVN分支
    SVN分支
    SVN 版本回退
    SVN 版本回退
    如何在excel中取消合并单元格后内容自动填充?
    如何在excel中取消合并单元格后内容自动填充?
    如何让自己像打王者荣耀一样发了疯、拼了命的学习?
  • 原文地址:https://www.cnblogs.com/sgtb/p/3685761.html
Copyright © 2011-2022 走看看