系统学习TCL脚本入门教程.docx

上传人:b****6 文档编号:5288235 上传时间:2022-12-14 格式:DOCX 页数:73 大小:55.53KB
下载 相关 举报
系统学习TCL脚本入门教程.docx_第1页
第1页 / 共73页
系统学习TCL脚本入门教程.docx_第2页
第2页 / 共73页
系统学习TCL脚本入门教程.docx_第3页
第3页 / 共73页
系统学习TCL脚本入门教程.docx_第4页
第4页 / 共73页
系统学习TCL脚本入门教程.docx_第5页
第5页 / 共73页
点击查看更多>>
下载资源
资源描述

系统学习TCL脚本入门教程.docx

《系统学习TCL脚本入门教程.docx》由会员分享,可在线阅读,更多相关《系统学习TCL脚本入门教程.docx(73页珍藏版)》请在冰豆网上搜索。

系统学习TCL脚本入门教程.docx

系统学习TCL脚本入门教程

 

系统学习TCL脚本入门教程

 

版本:

1.0

 

目录

1TCL语法4

1.1简介4

1.2运行环境4

1.3本文约定4

1.4参考资料4

2引言5

2.1第1课:

简单文本输出5

2.2第2课:

给变量赋值5

2.3第3课:

命令的赋值与置换一6

2.4第4课:

命令的赋值与置换二7

2.5第5课:

命令的赋值与置换三7

2.6第6课:

算数运算8

2.7第7课:

文本比较-SWITCH应用9

2.8第8课:

数值比较-IF应用10

2.9第9课:

WHILE循环11

2.10第10课:

FOR循环和incr11

2.11第11课:

过程PROC12

2.12第12课:

过程PROC的参数定义13

2.13第13课:

变量的作用域13

2.14第14课:

LIST结构14

2.15第15课:

LIST项的增删改15

2.16第16课:

更多LIST相关16

2.17第17课:

字符串函数17

2.18第18课:

更多字符串函数17

2.19第19课:

修改字符串函数19

2.20第20课:

正则表达式21

2.21第21课:

更多正则表达式22

2.22第22课:

数组24

2.23第23课:

更多数组相关25

2.24第24课:

文件存取28

2.25第25课:

文件信息30

2.26第26课:

TCL中的子进程调用-open&exec33

2.27第27课:

命令或者变量是否存在-info34

2.28第28课:

解释器状态-info35

2.29第29课:

过程信息-info36

2.30第30课:

模块化-source37

2.31第31课:

建库-unknown&infolibrary38

2.32第32课:

创建命令-eval40

2.33第33课:

在eval中应用format&list40

2.34第34课:

不使用eval替换-format&subst42

2.35第35课:

改变工作目录-cd&pwd43

2.36第36课:

调试和错误-errorinfo&errorCode&catch43

2.37第37课:

调试-trace45

2.38第38课:

命令行参数和环境串46

2.39第39课:

time&unset47

2.40第40课:

socket&fileevent&vwait49

2.41第41课:

日期时间-clock51

2.42第42课:

i/o通道-fblocked&fconfig53

2.43第43课:

子解释器55

2.44第44课:

数据库操作57

3跋60

1TCL语法

1.1简介

作为脚本语言,tcl语法简单而功能强大。

它诞生于80年代初,进入中国的时间也许多年了。

不过关于tcl的资料多而杂,一时心血来潮,想到写一篇文章,以例子为中心,系统讲解tcl语法,让技术人员花最少的时间对tcl有个全面而系统的了解,工作上使用时可以速查或参考代码。

于是有了本文。

1.2运行环境

多数代码运行在ActiveTcl8.3.4.1-9.win32-ix86.exe安装以后的windows环境中,只有两个例程运行在unix的环境下。

1.3本文约定

本文为了便于速查和速学,所以每课分成讲解和例子两部分,主要是围绕着例子进行讲解。

文字不多。

1.4参考资料

本文主要参考了《TclTutor2.0beta4》。

2引言

2.1第1课:

简单文本输出

讲解:

1.注释符号是#或者;#,在命令后注释用;#,在行开头两者均可;

2.puts:

输出文本,多个单词如被空格或TAB分隔需要使用“”或{}括起来;

3.多个命令写在一行使用;间隔。

例子:

002_puts.tcl

#ok;#正确

;#ok;#正确

;#ok;#正确,分号和井号之间可以有空格

putsHello;#正确

putsHello,World;#正确,多个单词之间不是被空格或者TAB分隔开

putsHelloWorld;#这行命令运行出错,被空格分隔

puts"Hello,World-Inquotes";#注释

puts{Hello,World-InBraces}#这行命令运行出错,必须使用;#作为注释符号

puts"Thisisline1";puts"thisisline2";#正确,用分号分隔两个命令

puts"Hello,World;-Withasemicoloninsidethequotes";#正确,分号在双引号内,作为字符串一部分

2.2第2课:

给变量赋值

讲解:

1.set:

给变量赋值,格式为setvarvalue

例子:

003_var.tcl

;#给变量X赋一个字符串

setX"Thisisastring"

;#给变量Y赋一个数字

setY1.24

;#显示X和Y的内容

puts$X

puts$Y

;#打印一个分隔串

puts"..............................."

;#打印在一行中,推荐使用双引号

setlabel"ThevalueinYis:

"

puts"$label$Y"

puts$label$Y

2.3第3课:

命令的赋值与置换一

讲解:

1.TCL中命令的赋值分为置换和赋值两个步骤

2.续行符为\

3.转义符同为\

4.特殊字符列表:

序号

字符

输出

十六进制

1

\a

响铃

\x07

2

\b

回车

\x08

3

\f

清屏

\x0c

4

\n

换行

\x0a

5

\r

回车

\x0d

6

\t

制表符

\x09

7

\v

垂直制表符(VerticalTab)

\x0b

8

\ddd

八进制值

d=0-7

9

\xhh

十六进制值

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

例子:

004_eval.tcl

;#Showhowa\affectsthe$

setZ"Albany"

setZ_LABEL"TheCapitolofNewYorkis:

"

puts"$Z_LABEL$Z";#显示Albany

puts"$Z_LABEL\$Z";#显示$Z,被\转义

;#Thenextlineneedsabackslashtoescapethe'$'

puts"\nBenFranklinisonthe\$100.00bill";#\n换行;$100前的\必须有,否则会将100作为一个变量,提示出错

seta100.00

puts"Washingtonisnotonthe$abill";#Thisisnotwhatyouwant

puts"Lincolnisnotonthe$$abill";#显示$100,说明是后结合的,先置换了$a,此处严格的写应该写为\$$a

puts"Hamiltonisnotonthe\$abill";#显示$a

puts"BenFranklinisonthe\$$abill";#显示$100,说明是后结合的,先置换了$a

puts"\n.................examplesofescapestrings"

puts"Tab\tTab\tTab"

puts"Thisstringprintsout\nontwolines";#行中\没有打印出来,如果要打印出来,需要写成\\

puts"Thisstringcomesout\

onasingleline";#当一行太长,不便于阅读,使用\做续行符

2.4第4课:

命令的赋值与置换二

讲解:

1.最外层是{}则不会进行置换操作,但其中的续行符仍然有效

例子:

005_escape.tcl

setZ"Albany"

setZ_LABEL"TheCapitolofNewYorkis:

"

puts"\n.................examplesofdifferencesbetween\"and\{";#and前的双引号前必须有\进行转义,否则这个双引号回和前面的双引号结合,导致成了“xxx”and\{“的结构,会提示出错

puts"$Z_LABEL$Z";#显示TheCapitolofNewYorkis:

Albany

puts{$Z_LABEL$Z};#显示$Z_LABEL$Z,没有进行置换,{}中不会置换

puts"\n.......examplesofdifferencesinnesting\{and\""

puts"$Z_LABEL{$Z}";#最外层是双引号,所以进行了置换

puts{Whosaid,"Whatthiscountryneedsisagood$Zcigar!

"?

};#最外层是花括号,所以没有进行置换

puts"\n.................examplesofescapestrings"

puts{Therearenosubstitutionsdonewithinbraces\n\r\x0a\f\v};#

puts{But,theescapednewlineattheendofa\

stringisstillevaluatedasaspace};#续行符仍然生效

2.5第5课:

命令的赋值与置换三

讲解:

1.[]可以传递其中的命令结果,注意不能被{}包含;

2.双引号包含的[]中的命令可以正常执行,命令结果也可以传出;

3.{}包含的[]中的命令不会执行,更不会有命令结果传出来。

例子:

006_escape.tcl

setx"abc"

puts"Asimplesubstitution:

$x\n";#显示abc

sety[setx"def"];#先执行[]中的命令,将”def”赋值给x,然后将该命令的结果赋值给y

puts"Rememberthatsetreturnsthenewvalueofthevariable:

X:

$xY:

$y\n";#显示x和y都是def

setz{[setx"Thisisastringwithinquoteswithinbraces"]};#由于在{}中,所以并没有执行对x的赋值,只是将{}赋值给z

puts"Notethecurlybraces:

$z\n"

seta"[setx{Thisisastringwithinbraceswithinquotes}]";#执行了对x的赋值操作,并将值传出来赋给了a

puts"Seehowthesetisexecuted:

$a"

puts"\$xis:

$x\n"

setb"\[sety{Thisisastringwithinbraceswithinquotes}]"

puts"Notethe\\escapesthebracket:

\n\$bis:

$b"

puts"\$yis:

$y"

2.6第6课:

算数运算

讲解:

1.操作符

序号

操作符

解释

1

-+~!

-:

负号+:

正号~:

位操作非!

:

逻辑非

2

*/%

*:

乘/:

除%:

取模

3

+-

+:

加-:

4

<<>>

<<:

循环左移>>:

循环右移

5

&

&:

按位与

6

^

^:

按位异或

7

|

|:

按位或

8

&&

&&:

逻辑与

9

||

||:

逻辑或

10

x?

y:

z

if-then-else

2.数学函数

序号

函数

序号

函数

1

acos

11

log10

2

cos

12

tan

3

hypot

13

atan2

4

sinh

14

floor

5

asin

15

pow

6

cosh

16

tanh

7

log

17

ceil

8

sqrt

18

fmod

9

atan

19

sin

10

exp

例子:

007_math.tcl

setX100;

setY256;#行末是否有分号都可以

setZ[expr"$Y+$X"];#变量是否被双引号包含都可以,不过建议使用双引号

setZ[expr$Y+$X]

setZ_LABEL"$Yplus$Xis"

puts"$Z_LABEL$Z"

puts"Thesquarerootof$Yis[exprsqrt($Y)]\n"

puts"Becauseoftheprecedencerules\"5+-3*4\"is:

[expr-3*4+5]"

puts"Becauseoftheparentheses\"(5+-3)*4\"is:

[expr(5+-3)*4]"

puts"\n.................moreexamplesofdifferencesbetween\"and\{"

puts{$Z_LABEL[expr$Y+$X]};#外层是花括号不会进行置换

puts"$Z_LABEL{[expr$Y+$X]}";#外层是双引号会进行置换

puts"Thecommandtoaddtwonumbersis:

\[expr\$a+\$b]"

2.7第7课:

文本比较-SWITCH应用

讲解:

1.switch的分支中的命令使用花括号包含,但是并不会影响花括号中的命令执行,切记,这是switch的格式;

2.如果不想分支条件进行置换,需要在外加上花括号,不会影响分支中的命令执行。

例子:

008_switch.tcl

;#Setthevariableswe'llbecomparing

setx"ONE";

sety1;

setz"ONE";

;#Thisislegal

switch$x"ONE""putsONE=1""TWO""putsTWO=2""default""putsNO_MATCH";#这种写法合法,但是阅读不便

switch$x\

"ONE""putsONE=1"\

"TWO""putsTWO=2"\

"default""putsNO_MATCH";#这种写法好看一些,推荐

;#下面这种写法$z被置换,走入$z的条件分支,表面上看条件分支中的命令在花括号内,这只是switch的一种格式,所以其中的命令仍然被执行了。

switch$x\

"$z"{sety1[expr$y+1];puts"MATCH\$z.$y+$zis$y1"}\

"ONE"{sety1[expr$y+1];puts"MATCHONE.$y+oneis$y1"}\

"TWO"{sety1[expr$y+2];puts"MATCHTWO.$y+twois$y1"}\

"THREE"{sety1[expr$y+3];puts"MATCHTHREE.$y+threeis$y1"}\

"default"{puts"$xdoesnotmatchanyofthesechoices"}

;#Thisformofthecommanddisablesvariablesubstitutioninthepattern

;#下面为了不置换$z,在外层加上了花括号,于是走入了ONE分支,而分支中的命令仍然被执行了

switch$x{

"$z"{sety1[expr$y+1];puts"MATCH\$z.$y+$zis$y1"}

"ONE"{sety1[expr$y+1];puts"MATCHONE.$y+oneis$y1"}

"TWO"{sety1[expr$y+2];puts"MATCHTWO.$y+twois$y1"}

"THREE"{sety1[expr$y+3];puts"MATCHTHREE.$y+threeis$y1"}

"default"{puts"$xisNOTAMATCH"}

}

2.8第8课:

数值比较-IF应用

讲解:

1.条件式结果

FALSE

TRUE

数值

0

非零

yes/no

no

yes

true/false

false

true

2.置换变量的方法,setyx;puts$$y,因为是后结合并且是一次置换,所以打出来的是$x,不是$x的值;但是在if的条件式中进行了二次置换,$$y被置换成了$x的值

3.注意:

新行中需要写为}else{,不能将}写到前一行的末尾,也不能省略}后面的那个空格,后面的{也需要写在当行,并且前面需要一个空格。

例子:

009_if.tcl

setx1;

if{$x==2}{puts"$xis2"}else{puts"$xisnot2"};#判断是否相等使用==

if{$x!

=1}{;#判断是否不等使用!

=

puts"$xis!

=1"

}else{

puts"$xis1"

}

if$x==1{puts"GOT1"}

setyx;

if"$$y!

=1"{;#在if条件式中$$y进行了二次置换

puts"$$yis!

=1";#在puts命令中,只进行了一次置换

}else{

puts"$$yis1"

}

2.9第9课:

WHILE循环

x讲解:

1.while后面的条件表达式是放在花括号中的;放在双引号中会只执行一次置换

例子:

010_while.tcl

setx1;

while{$x<5}{puts"xis$x";setx[expr$x+1]}

puts"exitedfirstloopwithXequalto$x\n"

setx0;

while"$x<5"{;#只执行一次置换1<5,于是该条件永远为真

setx[expr$x+1]

if{$x>6}break;;#如果去掉这句就成了死循环

if"$x>3"continue;;#这句使4打不出来

puts"xis$x";

}

puts"exitedsecondloopwithXequalto$x\n"

2.10第10课:

FOR循环和incr

讲解:

1.incrx和setx[expr$x+1]达到一样的效果,向上加一

x

例子:

011_for.tcl

for{puts"Start";seti0}{$i<2}{incri;puts"Iafterincr:

$i";}{;#第一部分只执行一次,后面两部分每次循环都会执行

puts"Iinsidefirstloop:

$i"

}

for{puts"Start";seti3}{$i<2}{incri;puts"Iafterincr:

$i";}{;#不会执行循环体中的命令

puts"Iinsidesecondloop:

$i"

}

puts"Start";seti0;

while{$i<2}{

puts"Iinsidefirstloop:

$i"

incri;

puts"Iafterincr:

$i";

}

2.11第11课:

过程PROC

讲解:

1.格式:

procnameargsbody

2.调用方法中参数可以用花括号或者双引号包含,也可以不包含

3.在puts等命令中需要置换的话,需要使用方括号

例子:

012_proc.tcl

procsum{arg1arg2}{

setx[expr$arg1+$arg2];

return$x;#过程返回值

}

puts"Thesumof2+3is:

[sum23]\n\n";#调用过程

#puts"Thesumof2+3is:

[sum{23}]\n\n";#出错,提示找不到第二个参数,置换过程中第一个参数是{23},所以找不到第二个参数

puts"Thesumof2+3is:

sum(23)\n\n";#输出sum(23),因为没有方括号,根本没有进行置换

puts"Thesumof2+3is:

sum{23}\n\n";#输出sum{23},因为没有方括号,根本没有进行置换

sum23;#正确

sum{2}{3};#正确

sum"2""3";#正确

procfor{abc}{

puts"Theforcommandhasbeenreplacedbyaputs";

puts"Theargumentswere:

$a\n$b\n$c\n"

}

for{seti1}{$i<10}{incri}

2.12第12课:

过程PROC的参数定义

讲解:

1.过程的参数赋缺省值:

procname{arg1{arg2value}}

2.过程的不确定个数的参数定义:

procname{arg1args}

例子:

013_proc.tcl

procexample{first{second""}args}{;#参数定义:

赋缺省值和不确定个数参数定义

if{$second==""}{

puts"Thereisonlyoneargumentanditis:

$first";

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1