1、2.24 第24课:文件存取 282.25 第25课:文件信息 302.26 第26课:TCL中的子进程调用open & exec 332.27 第27课:命令或者变量是否存在info 342.28 第28课:解释器状态info 352.29 第29课:过程信息info 362.30 第30课:模块化source 372.31 第31课:建库unknown & info library 382.32 第32课:创建命令eval 402.33 第33课:在eval中应用format & list 402.34 第34课:不使用eval替换format & subst 422.35 第35课:改变
2、工作目录 cd & pwd 432.36 第36课:调试和错误errorinfo & errorCode & catch 432.37 第37课:调试trace 452.38 第38课:命令行参数和环境串 462.39 第39课:time & unset 472.40 第40课:socket & fileevent & vwait 492.41 第41课:日期时间clock 512.42 第42课:i/o通道fblocked & fconfig 532.43 第43课:子解释器 552.44 第44课:数据库操作 573 跋 601 TCL语法1.1 简介作为脚本语言,tcl语法简单而功能强大
3、。它诞生于80年代初,进入中国的时间也许多年了。不过关于tcl的资料多而杂,一时心血来潮,想到写一篇文章,以例子为中心,系统讲解tcl语法,让技术人员花最少的时间对tcl有个全面而系统的了解,工作上使用时可以速查或参考代码。于是有了本文。1.2 运行环境多数代码运行在 ActiveTcl8.3.4.1-9.win32-ix86.exe 安装以后的windows环境中,只有两个例程运行在unix的环境下。1.3 本文约定本文为了便于速查和速学,所以每课分成讲解和例子两部分,主要是围绕着例子进行讲解。文字不多。1.4 参考资料本文主要参考了TclTutor 2.0 beta4。2 引言简单文本输出
4、讲解:1 注释符号是 或者 ;# ,在命令后注释用 ;# ,在行开头两者均可;2 puts :输出文本,多个单词如被空格或TAB分隔需要使用“”或 括起来;3 多个命令写在一行使用 ; 间隔。例子:002_puts.tcl# ok ;# 正确; # ok ;# 正确, 分号和井号之间可以有空格puts Hello ;puts Hello,World ;# 正确,多个单词之间不是被空格或者TAB分隔开puts Hello World ;# 这行命令运行出错,被空格分隔puts Hello, World - In quotes ;# 注释puts Hello, World - In Braces
5、# 这行命令运行出错,必须使用 ;# 作为注释符号This is line 1 puts this is line 2# 正确,用分号分隔两个命令Hello, World; - With a semicolon inside the quotes#正确,分号在双引号内,作为字符串一部分给变量赋值1 set:给变量赋值,格式为 set var value003_var.tcl# 给变量X赋一个字符串set X This is a string# 给变量Y赋一个数字set Y 1.24# 显示X和Y的内容puts $Xputs $Y# 打印一个分隔串.# 打印在一行中,推荐使用双引号set lab
6、el The value in Y is: $label $Yputs $label$Y命令的赋值与置换一1 TCL中命令的赋值分为置换和赋值两个步骤2 续行符为 3 转义符同为 4 特殊字符列表:序号字符输出十六进制1a响铃x072b回车x083f清屏x0c4n换行x0a5rx0d6t制表符x097v垂直制表符(Vertical Tab)x0b8ddd八进制值d=0-79xhh十六进制值h=0-9,A-F,a-f004_eval.tcl# Show how a affects the $set Z Albanyset Z_LABEL The Capitol of New York is:$Z
7、_LABEL $Z ;#显示Albany$Z_LABEL $Z#显示$Z,被 转义# The next line needs a backslash to escape the $nBen Franklin is on the $100.00 bill# n换行; $100前的 必须有,否则会将100作为一个变量,提示出错set a 100.00Washington is not on the $a bill# This is not what you wantLincoln is not on the $a bill# 显示$100,说明是后结合的,先置换了$a,此处严格的写应该写为 $aH
8、amilton is not on the $a bill# 显示$aBen Franklin is on the $a bill# 显示$100,说明是后结合的,先置换了$an. examples of escape stringsTabtTabtTabThis string prints out non two lines# 行中 没有打印出来,如果要打印出来,需要写成 This string comes outon a single line# 当一行太长,不便于阅读,使用 做续行符命令的赋值与置换二1最外层是 则不会进行置换操作,但其中的续行符仍然有效005_escape.tcln.
9、examples of differences between and #and前的双引号前必须有 进行转义,否则这个双引号回和前面的双引号结合, 导致成了 “xxx” and “ 的结构,会提示出错# 显示The Capitol of New York is: Albanyputs $Z_LABEL $Z ;# 显示 $Z_LABEL $Z,没有进行置换,中不会置换n. examples of differences in nesting and $Z_LABEL $Z# 最外层是双引号,所以进行了置换puts Who said, What this country needs is a g
10、ood $Z cigar!? ;#最外层是花括号,所以没有进行置换puts There are no substitutions done within braces n r x0a f v ;#puts But, the escaped newline at the end of astring is still evaluated as a space ;#续行符仍然生效命令的赋值与置换三1 可以传递其中的命令结果,注意不能被 包含;2 双引号包含的 中的命令可以正常执行,命令结果也可以传出;3 包含的 中的命令不会执行,更不会有命令结果传出来。006_escape.tclset x ab
11、cA simple substitution: $xn#显示abcset y set x def ;#先执行中的命令,将”def”赋值给x,然后将该命令的结果赋值给yRemember that set returns the new value of the variable: X: $x Y: $yn#显示x和y都是defset z set x This is a string within quotes within braces ;#由于在中,所以并没有执行对x的赋值,只是将赋值给zNote the curly braces: $znset a set x This is a strin
12、g within braces within quotes#执行了对x的赋值操作,并将值传出来赋给了aSee how the set is executed: $a$x is:set b set y This is a string within braces within quotesNote the escapes the bracket:n $b is: $b$y is: $y算数运算1 操作符操作符解释- + !- : 负号 + : 正号 : 位操作非 ! : 逻辑非* / %* : 乘 / : 除 % : 取模+ -+ : 加 - : 减 循环左移 循环右移& 按位与 : 按位异或|
13、 : 按位或 逻辑与| : 逻辑或10x?y:zif-then-else2 数学函数函数acos11log10cos12tanhypot13atan2sinh14floorasin15powcosh16tanhlog17ceilsqrt18fmodatan19sinexp007_math.tclset X 100;set Y 256 ;# 行末是否有分号都可以set Z expr $Y + $X# 变量是否被双引号包含都可以,不过建议使用双引号set Z expr $Y + $X$Y plus $X is The square root of $Y is expr sqrt($Y)nBecau
14、se of the precedence rules 5 + -3 * 4 is: expr -3 * 4 + 5Because of the parentheses (5 + -3) * 4 expr (5 + -3) * 4n. more examples of differences between puts $Z_LABEL expr $Y + $X ;#外层是花括号不会进行置换$Z_LABEL expr $Y + $X# 外层是双引号会进行置换The command to add two numbers is: expr $a + $b文本比较SWITCH应用1 switch的分支中
15、的命令使用花括号包含,但是并不会影响花括号中的命令执行,切记,这是switch的格式;2 如果不想分支条件进行置换,需要在外加上花括号,不会影响分支中的命令执行。008_switch.tcl# Set the variables well be comparingONEset y 1;set z # This is legalswitch $x puts ONE=1TWOputs TWO=2defaultputs NO_MATCH#这种写法合法,但是阅读不便switch $x #这种写法好看一些,推荐#下面这种写法$z被置换,走入$z的条件分支,表面上看条件分支中的命令在花括号内,这只是swi
16、tch的一种格式,所以其中的命令仍然被执行了。$z set y1 expr $y+1;MATCH $z. $y + $z is $y1 MATCH ONE. $y + one is $y1 set y1 expr $y+2;MATCH TWO. $y + two is $y1THREE set y1 expr $y+3;MATCH THREE. $y + three is $y1 puts $x does not match any of these choices# This form of the command disables variable substitution in the
17、pattern#下面为了不置换$z,在外层加上了花括号,于是走入了ONE分支,而分支中的命令仍然被执行了switch $x $x is NOT A MATCH数值比较IF应用1 条件式结果FALSETRUE数值非零yes / nonoyestrue / falsefalsetrue2置换变量的方法,set y x ; puts $y ,因为是后结合并且是一次置换,所以打出来的是 $x ,不是$x的值;但是在if的条件式中进行了二次置换, $y 被置换成了 $x 的值3注意:新行中需要写为 else ,不能将 写到前一行的末尾,也不能省略 后面的那个空格,后面的 也需要写在当行,并且前面需要一个
18、空格。009_if.tclset x 1;if $x = 2 puts $x is 2 else puts $x is not 2#判断是否相等使用 =if $x != 1 ;#判断是否不等使用 !=$x is != 1 else $x is 1if $x=1 puts GOT 1set y x;if $y ! ;#在if条件式中$y进行了二次置换$y is !#在puts命令中,只进行了一次置换$y is 1WHILE 循环x讲解:1while后面的条件表达式是放在花括号中的;放在双引号中会只执行一次置换010_while.tclwhile $x 5 puts x is $x set x e
19、xpr $x + 1exited first loop with X equal to $xnset x 0;while $x 5#只执行一次置换16 break;#如果去掉这句就成了死循环 if $x 3 continue;#这句使4 打不出来 exited second loop with X equal to $xnFOR循环和incr1incr x 和 set x expr $x + 1 达到一样的效果,向上加一x011_for.tclfor puts Start set i 0 $i 2 incr i;I after incr: $i ;#第一部分只执行一次,后面两部分每次循环都会执
20、行I inside first loop: set i 3 $i #不会执行循环体中的命令I inside second loop: set i 0;while $i 2 incr i;过程PROC1 格式:proc name args body2 调用方法中参数可以用花括号或者双引号包含,也可以不包含3 在puts等命令中需要置换的话,需要使用方括号012_proc.tclproc sum arg1 arg2 set x expr $arg1+$arg2; return $x ;#过程返回值 The sum of 2 + 3 is: sum 2 3nn#调用过程#puts sum 2 3nn
21、#出错,提示找不到第二个参数,置换过程中第一个参数是2 3,所以找不到第二个参数 sum(2 3)nn#输出sum(2 3),因为没有方括号,根本没有进行置换 sum2 3nn#输出sum2 3,因为没有方括号,根本没有进行置换sum 2 3 ;#正确sum 2 3 ;sum 23proc for a b c The for command has been replaced by a putsThe arguments were: $an$bn$cnfor set i 1 $i 10 incr i过程PROC的参数定义1 过程的参数赋缺省值:proc name arg1 arg2 value2 过程的不确定个数的参数定义:proc name arg1 args013_proc.tclproc example first second args ;#参数定义:赋缺省值和不确定个数参数定义 if $second = There is only one argument and it is: $first
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1