NS协议仿真Tcl脚本语言教程
命令
命令
命令
和
命令
命令
命令
命令
过程
■过程定义和返回值
部变量和全局变量
■缺省参数和可变个数参数
■引用:
字符操作
命令
命令
命令
【正则表达式规则详细说明】
命令
命令
■■■■■
□■■■■
文件访问
■文件名
■基本文件输入输出命令
随机文件访问
当前工作目录
坟件操作和获取文件信息
错误和异常
■错误
■从脚本中产生错误
■使用捕获错误
■其他异常
探入
■查询数组中的元素
命令
■变量信息
■过程信息
命令信息
■的版本和库
命令的执行付间
■跟踪变量
■命令的重命名和删除
命令
自动加载
Tel
语法
脚本、命令和单词符号
一个TCL脚本可以包含一个或多个命令。命令之间必须用換行符或分号隔开,下面的两个脚本
都是合法的:
seta1
setb2
seta1:setb2
TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的
参数,单词之间必须用空格或TAB键隔开。
TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL解释器运用规
则把命令分成一个个独立的单词,同时进行必要的置换(substitution):在执行阶段,TCL解
释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应
的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。
■置换ubstitution)
注:在下面的所有章节的例子中,"%为TCL的命令提小符,输入命令回车后,TCL会在接着的
行输出命令执行结。W′后面是我自己加上的说明,不是例子的一部分。
TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如:
sex10∥/定义变量x,并把ⅹ的值赋为10
10
%setyX+100/y的值是x+100,而不是我们期望的110
x+100
上例的第二个命令中,ⅹ被看作字符串ⅹ+100的一部分,如果我们想使用ⅹ的值'10′,就必
须告诉TCL解释器:我们在这旦期望的是变量ⅹ的值,而非字符ⅹ。怎么告诉TCL解释器呢,
这就要用到TCL语言中提供的置换功能
TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个
单词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌
套
■变量置换(variablesubtitution)
变量置换由一个S符号标记,变量置换会导致变量的值插入一个单词中。例如:
%sety$x+100/y的值是10+100,这里x被置换成它的值10
10+100
这时,y的值还不是我们想要的值110,而是10+100,因为TCL解释器把10+100看成是
个字符串而不是表达式,y要想得到值110,还必须用命令置换,使得TCL会把10+100看
成一个表达式并求值
■命令置换(commandsubstitution)
命令置换是巾[]括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被
另一个命令的结果所代替。例如:
%osety[expr$x+100]
110
y的值是110,这里当TCL解释器遇到字符"['时,它就会把随后的expr作为一个命令名,从
而激活与expr对应的c/C++过程,并把expr'和变量置换后得到的'10+110传递给该命令过
程进行处理
如果在上例中我们去掉[],那么TCL会报错。因为在正常情况下,TCL解释器只把命令行中的
第一个单词作为看作命令,其他的单词都作为普通字符串处理,看作是命令的参数。
注意,口中必须是一个合法的TCL却木,长度个限。[]中脚本的值为最后一个命令的返回值,
例如
%sety[expr$X+100;setb300]/y的值为300,因为setb300的返回值为300
300
有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参
数
■反斜杠置换(backslashsubstitution)
TCL语言中的反斜杠置换类似于C语言屮反斜杠的用法,)要用于在单词符号屮插入诸如换行
符、空格、[、$等被TCL解释器当作特殊符号对待的字符。例如:
setmsgmultiple\space//msg的值为multiplespace。
如果没有"的话,TCL会报错,因为解释器公把这里最后两个单词之间的空格认为是分隔符,
于是发现set命令有多于两个参数,从而报错。加入了"\后,空格不被当作分隔符,'multiple
space被认为是一个单词(Word)。又例如:
%setmsgmoney\\$3333\\nArray\a\[2]
/这个命令的执行结果为:money$3333
Arraya[2]
这甲的$不再被当作变量置换符。
TCL支持以下的反斜杠置换:
BackslashSequenceReplacedBy
aaudiblealert(0×7)
bBackspace(0×8)
AfFormfeed(Oxc)
AnNewline(oxa)
Arcarriagereturn(Oxd)
tTab(0×9)
\VVerticaltab(Oxb)
Adddoctalvaluegivenbyddd
(one,two,orthreeds)
WxhhHexvaluegivenbyhh
(anynumberofh's)
Anewlinespaceasinglespacecharacter
例
%seta\x48//对应xh
H//十六进制的48正好是72,对应H
%seta\110//对应ddd
H//八进制的110正好是72,对应H
%seta[expr\/对应elinespace,一个命令可以用\newline转到下一行继续
2+3]
■双引号和花括号
除了使用反斜杠外,τCL提供弜外两种方法来使得解释器把分隔符和賀换符竽特殊字符当作普
通字符,而不作特殊处坦,这就要使用双引号和化括号({})
TCL解释器对双引号中的各种分隔符将伈作处理,但是对换行符及$和[]两种置换符会照常处
理。例如:
%osetx100
100
%osety$xddd
100ddd
而在花括号中,所有特殊宇符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特
殊处理。
%osetyi/nsx[expr10+1001
/n$X[expr10+100]
■注释
TCL中的注释符是'#','#'和直到所在行结尾的所有宇符都被TCL看作注释,TCL解释器对注
释将不作任何处理。不过,要注意的是,'艹'必须出现在TCL解释器期望命令的第一个字符出现
的地方,才被当作注释。
例如
%/0++Thisisacomment
%oseta100*tnotacomment
wrongargs:shouldbesetvarName?newvalue?
%setb101.thisisacomment
101
第二行中'艹'就不破当作注释符,因为它出现在命令的中间,TCL解释器把它和后面的宇符当作
命令的参数处理,从而导致错误。而第四行的'艹"就被作为注释,因为前一个命令已经用一个分
号结束,TCL解释器期望下一个命令接着出现。现在在这个位置出现'#’,随后的字符就被当作
注释了。
变量
■简单变量
个TCL的简单变量包含两个部分:名字和值。名字和值都可以是任意字符串。例如一个名为
13237&*:hdgg"的变量在TCL中都是合法的。不过为了更好的使用置换(substitution),
变量名最好按CC++语言中标识符的命名规则命名。TCL解释器在分析一个变量置换时,只
把从$符号往后直到第个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变量
的名字。例如:
%oseta2
seta14
%/osetbsa.1
2,1
在最后一个命令行,我们希望把变量a.1的值付给b,但是TCL解释器在分析时只把$符号之后
直到第一个不是字忖、数字或下划线的字符(这里是!.")之间的单词符号(这里是a")当作要被置换
的变量的名字,所以TCL解释器把a置换成2,然后把字符串ν2.1″给变量b。这显然与我们
的初衷不同。
当然,如果变量名中有不是宇忖、数字或下划线的字符,乂要用置换,可以用花括号把变量名括
起来。例如:
%osetbsta.1]
TCL中的set命令能生成一个变量、也能读取或改变一个变量的值。例如:
setaikdfjkjdf]
kdjkdf
如果变量a还没有定义,这个命令将生成变量a,并将其值置为kdf]kdf,若a己定义,就简
单的把a的值置为kdjkdf
%oseta
kdfkdf
这个只有一个参数的se命令读取a的当前值kdfijdf.。
下载地址
用户评论