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.

     

     

     

  • 相关阅读:
    VS 格式化代码 Ctrl + K, Ctrl + F
    VS NuGet使用
    VS书签的应用
    ASP.Net简单的交互案例
    英文书也没有那么难,跟着例子做,挺有意思的
    .Net强类型视图
    .Net视图机制
    .Net MVC小尝试
    ASP.Net MVC默认目录结构
    .Net中常用的几种ActionResult
  • 原文地址:https://www.cnblogs.com/sgtb/p/3685761.html
Copyright © 2011-2022 走看看