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

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

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

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

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

更多数组相关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&

catch44

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课:

子解释器56

2.44第44课:

数据库操作57

2.45第45课:

函数或过程数组的输入和输出方法59

2.46第46课:

info的用法59

2.47第47课:

多线程61

3跋73

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引言

简单文本输出

讲解:

1.注释符号是#或者;

#,在命令后注释用;

#,在行开头两者均可;

2.puts:

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

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

间隔。

例子:

002_puts.tcl

#ok;

#正确

;

#ok;

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

putsHello;

putsHello,World;

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

putsHelloWorld;

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

puts"

Hello,World-Inquotes"

;

#注释

puts{Hello,World-InBraces}#这行命令运行出错,必须使用;

#作为注释符号

Thisisline1"

puts"

thisisline2"

#正确,用分号分隔两个命令

Hello,World;

-Withasemicoloninsidethequotes"

#正确,分号在双引号内,作为字符串一部分

给变量赋值

1.set:

给变量赋值,格式为setvarvalue

003_var.tcl

#给变量X赋一个字符串

setX"

Thisisastring"

#给变量Y赋一个数字

setY1.24

#显示X和Y的内容

puts$X

puts$Y

#打印一个分隔串

..............................."

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

setlabel"

ThevalueinYis:

"

$label$Y"

puts$label$Y

命令的赋值与置换一

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:

$Z_LABEL$Z"

;

#显示Albany

$Z_LABEL\$Z"

#显示$Z,被\转义

#Thenextlineneedsabackslashtoescapethe'

$'

\nBenFranklinisonthe\$100.00bill"

#\n换行;

$100前的\必须有,否则会将100作为一个变量,提示出错

seta100.00

Washingtonisnotonthe$abill"

#Thisisnotwhatyouwant

Lincolnisnotonthe$$abill"

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

Hamiltonisnotonthe\$abill"

#显示$a

BenFranklinisonthe\$$abill"

#显示$100,说明是后结合的,先置换了$a

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

Tab\tTab\tTab"

Thisstringprintsout\nontwolines"

#行中\没有打印出来,如果要打印出来,需要写成\\

Thisstringcomesout\

onasingleline"

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

命令的赋值与置换二

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

005_escape.tcl

\n.................examplesofdifferencesbetween\"

and\{"

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

#显示TheCapitolofNewYorkis:

Albany

puts{$Z_LABEL$Z};

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

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

$Z_LABEL{$Z}"

#最外层是双引号,所以进行了置换

puts{Whosaid,"

Whatthiscountryneedsisagood$Zcigar!

"

?

};

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

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

#

puts{But,theescapednewlineattheendofa\

stringisstillevaluatedasaspace};

#续行符仍然生效

命令的赋值与置换三

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

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

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

006_escape.tcl

setx"

abc"

Asimplesubstitution:

$x\n"

#显示abc

sety[setx"

def"

];

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

Rememberthatsetreturnsthenewvalueofthevariable:

X:

$xY:

$y\n"

#显示x和y都是def

setz{[setx"

Thisisastringwithinquoteswithinbraces"

]};

#由于在{}中,所以并没有执行对x的赋值,只是将{}赋值给z

Notethecurlybraces:

$z\n"

seta"

[setx{Thisisastringwithinbraceswithinquotes}]"

#执行了对x的赋值操作,并将值传出来赋给了a

Seehowthesetisexecuted:

$a"

\$xis:

setb"

\[sety{Thisisastringwithinbraceswithinquotes}]"

Notethe\\escapesthebracket:

\n\$bis:

$b"

\$yis:

$y"

算数运算

1.操作符

操作符

解释

-+~!

-:

负号+:

正号~:

位操作非!

:

逻辑非

*/%

*:

乘/:

除%:

取模

+-

+:

加-:

<

>

>

循环左移>

循环右移

&

按位与

^

^:

按位异或

|

|:

按位或

逻辑与

||

||:

逻辑或

10

x?

y:

z

if-then-else

2.数学函数

函数

acos

11

log10

cos

12

tan

hypot

13

atan2

sinh

14

floor

asin

15

pow

cosh

16

tanh

log

17

ceil

sqrt

18

fmod

atan

19

sin

exp

007_math.tcl

setX100;

setY256;

#行末是否有分号都可以

setZ[expr"

$Y+$X"

#变量是否被双引号包含都可以,不过建议使用双引号

setZ[expr$Y+$X]

$Yplus$Xis"

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

Becauseoftheprecedencerules\"

5+-3*4\"

is:

[expr-3*4+5]"

Becauseoftheparentheses\"

(5+-3)*4\"

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

\n.................moreexamplesofdifferencesbetween\"

puts{$Z_LABEL[expr$Y+$X]};

#外层是花括号不会进行置换

$Z_LABEL{[expr$Y+$X]}"

#外层是双引号会进行置换

Thecommandtoaddtwonumbersis:

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

文本比较-SWITCH应用

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

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

008_switch.tcl

#Setthevariableswe'

llbecomparing

ONE"

sety1;

setz"

#Thisislegal

switch$x"

putsONE=1"

TWO"

putsTWO=2"

default"

putsNO_MATCH"

#这种写法合法,但是阅读不便

switch$x\

"

\

#这种写法好看一些,推荐

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

$z"

{sety1[expr$y+1];

MATCH\$z.$y+$zis$y1"

}\

MATCHONE.$y+oneis$y1"

}\

{sety1[expr$y+2];

MATCHTWO.$y+twois$y1"

THREE"

{sety1[expr$y+3];

MATCHTHREE.$y+threeis$y1"

{puts"

$xdoesnotmatchanyofthesechoices"

}

#Thisformofthecommanddisablesvariablesubstitutioninthepattern

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

switch$x{

}

$xisNOTAMATCH"

数值比较-IF应用

1.条件式结果

FALSE

TRUE

数值

非零

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}{;

#判断是否不等使用!

=

$xis!

=1"

}else{

$xis1"

if$x==1{puts"

GOT1"

setyx;

if"

$$y!

{;

#在if条件式中$$y进行了二次置换

$$yis!

#在puts命令中,只进行了一次置换

$$yis1"

WHILE循环

x讲解:

1.while后面的条件表达式是放在花括号中的;

放在双引号中会只执行一次置换

010_while.tcl

while{$x<

5}{puts"

xis$x"

setx[expr$x+1]}

exitedfirstloopwithXequalto$x\n"

setx0;

while"

$x<

5"

#只执行一次置换1<

5,于是该条件永远为真

setx[expr$x+1]

if{$x>

6}break;

#如果去掉这句就成了死循环

if"

$x>

3"

continue;

#这句使4打不出来

exitedsecondloopwithXequalto$x\n"

FOR循环和incr

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

x

011_for.tcl

for{puts"

Start"

seti0}{$i<

2}{incri;

Iafterincr:

$i"

}{;

#第一部分只执行一次,后面两部分每次循环都会执行

Iinsidefirstloop:

seti3}{$i<

#不会执行循环体中的命令

Iinsidesecondloop:

seti0;

while{$i<

2}{

incri;

过程PROC

1.格式:

procnameargsbody

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

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

012_proc.tcl

procsum{arg1arg2}{

setx[expr$arg1+$arg2];

return$x;

#过程返回值

Thesumof2+3is:

[sum23]\n\n"

#调用过程

#puts"

[sum{23}]\n\n"

#出错,提示找不到第二个参数,置换过程中第一个参数是{23},所以找不到第二个参数

sum(23)\n\n"

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

sum{23}\n\n"

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

sum23;

#正确

sum{2}{3};

sum"

2"

3"

procfor{abc}{

Theforcommandhasbeenreplacedbyaputs"

Theargumentswere:

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

for{seti1}{$i<

10}{incri}

过程PROC的参数定义

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

procname{arg1{arg2value}}

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

procname{arg1args}

013_proc.tcl

procexample{first{second"

}args}{;

#参数定义:

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

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

当前位置:首页 > 外语学习 > 韩语学习

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

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