TCL学习总结

本文档总结了TCL中的错误处理机制,包括errorproc的使用,catch语句捕获错误,以及return -code error生成错误的方式。通过示例展示了errorCode和errorInfo的变化,解释了如何在遇到错误如无效的proc调用、文件不存在等情况下,获取并处理错误信息。
摘要由CSDN通过智能技术生成



TCL程序安装说明:tcl安装程序必须放在根目录下,比如D:\。

2014-1-17
tcl开讲了,今天是第一期,掌声鼓励鼓励。
第一期讲些基础的东西。
认识脚本、命令、单词

脚本是由一条或多条命令组成的可运行文件,像training.tcl就是一个脚本。
命令由一个或多个单词组成,第一个单词是命令名,其它的是单词是命令的参数。如:set a 7
命令由换行符或分号隔开,单词通过空格或制表符隔开。

tcl处理一个命令分两步:解析和执行。
在解析步骤中,tcl运用各种规则(替换、引用等),将命令分解为单词,并执行替换。tcl不关心单词的内容。
在执行步骤中,各单词才有具体意义,tcl解析器调用具体的命令过程,将命令中的全部单词传递给该过程。


所谓替换就是把单词中的原始字符替换成另外一些值

tcl提供三种替换:变量替换、命令替换、反斜线替换

变量替换由$符引发,将tcl变量的值插入单词中。
命令替换由[ ]引发,将命令的执行结果传递给其它命令。
反斜线替换由\引起,用于向单词中插入像换行符这样的字符,以及像[、$这样的会被tcl解析器认为是有特殊含义的字符。

序号

字符

输出

十六进制

1

\a

响铃

\x07

2

\b

回车

\x08

3

\f

清屏

\x0c

4

\n

换行

\x0a

5

\r

回车

\x0d

6

\t

制表符

\x09

7

\v

垂直制表符(Vertical Tab)

\x0b

8

\ddd

八进制值

d=0-7

9

\xhh

十六进制值

h=0-9,A-F,a-f


所谓引用就是利用特殊办法阻止解析器对$和分号等字符进行特殊处理,保留其本意。
tcl提供两种引用:双引号引用和大括号引用

双引号引用由" "引发,双引号是定界符,不属于单词的一部分。双引号取消其中的单词和命令分隔符的特殊解释。也即空格、制表位、换行以及分号都当做普通字符处理,但替换能正常进行。
大括号引用由{ }引号,大括号也是定界符。大括号取消单词中所有特殊字符的特殊意义,所有字符原封不动。



proc test1 {} {
   #命令通过换行或分号隔开
 set a1 24 ;set b1 15
 set ab [expr $a1*$b1]
 set abc [set abcd 555]
 puts "a1 is $a1 \nb1 is $b1"
 puts "a1*b1 is $ab" ;#计算乘法
 puts "abc 是 $abc"  ;#可以有中文
 puts {a1*b1 is $ab} ;#输出结果不变
 }
  

2014-1-17
tcl第二讲,今天我们做练习,将上一讲的知识消化吸收加以巩固,其中会穿插讲一些规则,初次学习编程语言,一定要将规范都整清楚。

上一讲讲到了这么知识点:
脚本、命令、单词
命令的分隔、单词的分隔
三种替换
两种引用
注释

方括号引用里面可以有多条命令,用分号或换行符隔开,传递最后一条命令的值。
\  、\$、\"对特殊字符不做转义
\n:换行符
\t:制表位
反斜线-换行符-下一行开头的空白,会被替换为一个空格,在tcl解析前就会单独执行
变量替换、命令替换、以及反斜线替换在双引号中能正常进行。
如果想要在双引号括起来的单词中包含双引号,则应该使用反斜线替换。
proc test2 { } {
   set x 4
   set a1 24 ;set b1 15
   set y [ expr $x * 5 ; expr $x+10] 
   set msg eggs:\ \$2.18/dozen\ngasoline:\ \$2.49/gallon     
   set hello moyu\tyotc
   set wahaha \"a1*b1\ is\ $ab\"
   set tianlong \
      babu  
   set msk "a1 is $a1; the square of a1 is [expr $a1*$a1]"
   set name a.out
   set msr "couldnt open file \"$name\"" 
}

大括号最重要的应用之一就是延期处理,
proc test3 {value list} { 
set count 0
  foreach e1 $list {
   if $e1==$value {
   incr count
    }
    }
   return $count
}

要把一大段文字注释掉,可以用如下的方法:
proc test4 {value} {
    puts  "come on,lets go"
    while  {$value >=0} {
       puts  " value = $value"
       incr value -1
    }
}

proc test5 {value} {
    puts  "come on,lets go"
    if 0 {
    while  {$value >=0} {
       puts  " value = $value"
       incr value -1
    }
  }
}

有关替换命令的思考
1、替换的两条规则:
(a)tcl解析一条命令时,只从左向右解析一次,进行一轮替换。每个字符只会被扫描一次。
(b)每一个字符只会发生一层替换,而不会对替换后的结果再进行一次扫描替换。
2、替换可以用被用得十分复杂,但是不建议这么用。两种办法可以应对复杂替换:
(a)用format、subst及list等命令协助处理复杂的替换情况。
(b)建立过程,将复杂的操作隔离开来。

2014-1-18
tcl第三讲
这次讲tcl的变量。tcl的变量分两种:简单变量和关联数组。
proc test6 { } {
   set a6 jiangnanbaguai
   set a6
   set a6 12.6
   set a6 [expr $a6*4]
   puts $a6
   append a6 32
}
   
上面这个例子有点意思。先看前面三步:
(a) set命令后面有两个参数,a6和 jiangnanbaguai,由于a6事前没有创建,所以这步动作是先创建a6变量,然后将jiangnanbaguai赋值给a6。
(b) set命令后面只有一个参数,a6,这种情况下返回变量的当前值,这好理解。
(c) set命令后面有两个参数,a6和12.6,由于a6事先已经创建,所以这步是修改a6的值。

简单变量的故事我们讲完了,现在我们来讲内部数据存储。
怎么理解?我们知道tcl是基于字符串的语言,tcl中所有的值都有字符串表达形式,其中一部分有效率更高的内部表达形式。tcl会根据需要自动转换字符串和内部表达形式。比如上面的例子:
(d)  set a6 12.6中,tcl只存储变量的字符串表达形式,也即tcl把12.6认为是个字符串,而不认为是浮点数等其它的形式。
(e)  set a6 [expr $a6*4],在执行expr命令时,tcl会把字符串值解析为该值的内部浮点数表达形式。当set命令把expr的结果传递给a6时,只有内部浮点数表达形式存在。
(f)  puts $a6,将a6重新当做字符串对待,tcl在保留该值的内部表达形式的同时,产生该值的字符串表达形式。
(g) append a6 32,由于该命令修改了a6的字符串表达形式,tcl会更新该值的字符串表达形式的同时释放其内部浮点数表达形式。

别忘了还有另一类变量我们还没讲,下面我们来看看关联数组是怎么回事。
proc test7 { } {
 set week(monday)  700
 set week(tuesday)  600 
 set week(wednesday)  500 
 set week(thursday)  400 
 set week(friday)  300 
 set week(saturday)  200 
 set week(sunday)  100 
 set weektotal 0
 puts "lets
  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值