TCL整理
Tcl("Tool Command Language",即工具命令语言;Tcl念作“踢叩”"tickle")是一种易学易用易于扩展的脚本语言,实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些交互程序如文本编辑器、调试器和shell。它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。
Tcl和其他编程语言例如C不同,它是一种解释语言而非编译语言。Tcl程序由一系列Tcl 命令组成,在运行时由Tcl解释
器解释运行。
Tcl有大量的用C/C++编写的扩展用于提供Tcl本身不具有的功能。其中使用最广泛的扩展是TK,TK提供了各种OS平台下的图形用户界面GUI(连强大的Python语言都不单独提供自己的GUI,而是提供接口适配到TK上)。另一个流行的扩展包是Exp-ect,它提供了通过终端自动执行命令的能力,例如passwd,ftp,telnet等命令驱动的外壳。
一、Tcl程序基本结构
1、基本语法
Tcl有类似于shell的语法,一条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白(空格或TAB)分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。
Tcl解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,Tcl解释器运用规则识别出命令并把命令分成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,Tcl解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。
Tcl的命令名可以是内建的命令也可以是用户建的新命令,在应用程序中可用函数Tcl_CreateCommand来创建新的命令。所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。另外关于Tcl的注释有一个特殊的要求:'#'必须出现在Tcl解释器期望命令的第一个字符出现的地方,才被当作注释。
例如:
set a100#Not a comment
set b101;#this is a comment
第一个例子中'#'及其后面的内容会被当作set的参数而非注释从而导致参数个数错误;但第二个被解释为注释,因为'#'前面有一个分号,而分号和换行一样被看作是命令的分隔符。
脚步命令:
(1)eval命令
eval命令是一个用来构造和执行TCL脚本的命令,其语法为:
eval
它可以接收一个或多个参数,然后把所有的参数以空格隔开组合到一起成为一个脚本,然后对这个脚本进行求值。
(2)source命令
source命令读一个文件并把这个文件的内容作为一个脚本进行求值。例如:
source e:/tcl&l
注意路径的描述应该和UNIX相同,使用'/'而不是'\'。
2、置换(Substitution)
set x10
set y100+x
上面命令执行后,y的值是“100+x”而不是我们期望的110。这是因为Tcl解释器在分析命令时,把所有的命令参数都当作
字符串看待,所以x被看作了字符串“100+x”的一部分。如果我们想使用x的值'10',就必须告诉Tcl解释器:我们在这里期望的
是变量x的值,而非字符'x'。怎么告诉Tcl解释器呢,这就要用到Tcl语言中提供的置换功能。
Tcl提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换
可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。
(1)变量置换(variable substitution)
变量置换由一个$符号标记,变量置换会导致变量的值而非变量(标识符)本身被插入到字符串中。
set x10
set y100+$x
这时,y的值还不是我们想要的值110,而是10+100,因为Tcl解释器把10+100看成是一个字符串而不是表达式;y要想得到值110,还必须用命令置换,使得Tcl会把10+100看成一个表达式并求值。太乙真人出装
(2)命令置换(command substitution)
命令置换是由[]括起来的Tcl命令及其参数,命令置换会导致某一个命令的所有或部分单词(参数)被另一个命令的结果所代替。
广东移动积分商城
set x10
set y[expr100+$x]
这时,y的值就是110了。这里当Tcl解释器遇到字符'['时,它就会把随后的expr作为一个命令名,从而激活与expr对应的C/C++过程,并把expr命令中变量置换后得到的'10+110'传递给该命令过程进行处理。注意,[]中必须是一个合法的Tcl脚本,长度不限。[]中脚本的值为最后一个命令的返回值,例如:
草莓的英语
有了命令置换,实际上就表示命令之间是可以嵌套的,即一个命令的结果可以作为别的命令的参数。
(3)反斜杠置换(backslash subtitution)
Tcl语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、[、$等被Tcl解释器当作特殊符号对待的字符。例如:set msg multiple\space
如果没有'\'的话,Tcl会报错,因为解释器会把这里最后两个单词之间的空格认为是分隔符,于是发现set命令有多于两个参数,从而报错。加入了'\'后,空格不被当作分隔符,'multiple space'被认为是一个单词(word)。
(4)双引号和花括号
除了使用反斜杠外,Tcl提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作
普通字符,而不作特殊处理,这就要使用双引号和花括号({})。
Tcl解释器对双引号中的各种分隔符将不作处理,但是对换行符及$和[]两种置换符会照常处理。而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,Tcl解释器不会对其作特殊处理。
二、Tcl变量数据类型
Tcl只支持一种数据类型:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点,所有的东西都是字符串。(然而字符串的实际解释是依赖于其所处上下文。它有三种形式:命令,表达式和表)。
Tcl变量根据其结构的复杂程度分为“简单变量”和“数组变量”两类。
(1)简单变量
一个Tcl的简单变量包含两个部分:名字和值,其中名字和值都可以是任意字符串。不过为了更好的使用变量置换功能,变量名最好按C\C++语言中标识符的命名规则命名。这是因为Tcl解释器在分析一个变量置换时,只把从$符号往后直到第一个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变量的名字。例如:
set a2
set    a.15
set b$a.1
在最后一个命令行,我们希望把变量a.1的值付给b,但是Tcl解释器在分析时只把$符号之后直到第一
个不是字母、数字或下划线的字符(这里是'.')之间的单词符号(这里是'a')当作要被置换的变量的名字,所以Tcl解释器把a置换成2,然后把字符串“2.1”付给变量b。这显然与我们的初衷不同。当然,如果变量名中有不是字母、数字或下划线的字符又要用变量置换,可以用花括号把变量名括起来。例如:set b${a.1}
(2)数组变量
数组是一些元素的集合。Tcl的数组和一般编程语言中的数组有很大的区别。在Tcl中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中数组元素的名字包含两部分:数组名和数组中元素的名字,Tcl中数组元素的名字(下标〕可以为任何字符串。
例如:
set day(monday)1
set day(tuesday)2
(3)重用结构及其操作
1、string结构及其操作中国十大涂料品牌
因为TCL把所有的输入都当作字符串看待,所以TCL提供了较强的字符串操作功能【format】
语法:format formatstring
format命令类似于ANSIC中的sprintf函数,它按formatstring提供的格式,把各个value 的值组合到formatstring中形成一个新字符串,并返回。例如:
set msg[format"%s is%d years old"$name$age]
【scan】
语法:scan string formatsting
scan命令可以认为是format命令的逆,其功能类似于ANSI C中的sscanf函数。它按formatsting提供的格式分析string字符串,然后把结果存到变量varName中,注意除了空格和TAB键之外,string和formatsting中的字符和'%'必须匹配。例如:
scan"some2634""some%d%d"a b
【regexp】
润二月份有什么讲究
语法:regexp[switchs][--]exp string[matchVar]\[] regexp命令用于判断正规表达式exp是否全部或部分匹配字符串string,匹配返回1,否则0
regexp可以设置一些开关(switchs〕,来控制匹配的具体方式,如:-nocase,-line等,其中--表示这后面再没有开关(switchs〕了,即使后面有以'-'开头的参数也被当作正规表达式的一部分。如果regexp命令后面有参数matchVar和subMatchVar,则所有的参数被当作变量名,如果变量不存在,就会被生成。regexp把匹配整个正规表达式的子字符串赋给第一个变量,匹配正规表达式的最左边的子表达式的子字符串赋给第二个变
量,依次类推,例如:
regexp{([0-9]+)*([a-z]+)}"there is100apples"total num word1 puts"$total,$num,$word"
显示结果为:100apples,100,apples
其他具体的正则表达式规则请参考Tcl语言手册
【regsub】
语法:regsub[switchs]exp string subSpec varname
regsub的第一个参数是一个整个表达式,第二个参数是一个输入字符串,这一点和regexp 命令完全一样,也是当匹配
时返回1,否则返回0。不过regsub用第三个参数的值来替换字符串string中和正规表达式匹配的部分,第四个参数被认为是
一个变量,替换后的字符串存入这个变量中。例如:
regsub there"They live there lives"their x
puts$x
显示结果为:They live their lives
【sting】
语法:string subcmd ]
string命令具有强大的操作字符串的功能,并通过其中的subcmd来区别具体将要执行的string操作。他们中的一些如下:
1.string length string
string length"i like you"
10
2.string range string first last
Return a range of consecutive characters from string,starting with the character whose index is first and ending with the character whose is last.
string range sgkdkgh14
gkdk
3.string index string charIndex返回字符串中第charIndex个字符串,charIndex有三种表示方法integer:the char specified at this integral index经费管理办法
end:the last char of the string
end-interger:The last char of the string minus the specified integer offset (d-1would refer to t
he"c"in"abcd")
string index asbcd0返回a
string index asbcd end返回d
string index asbcd end-1返回c
string index asbcd2返回b
4.string tolower string[first][last]
String toupper string?First?last
Returns a value equal to string except that all upper(or title)case letters have been converted to lower case.
string tolower JFFKHJHJ返回jffkhjhj
string tolower JFFKHJHJ2返回JFfKHJHJ
string tolower JFFKHJHJ25返回JFfkhjHJ
5.string totitle string?first?last?
Returns a value equal to string except that the first character in string is converted to its Unicode title case variant(or upper case if there is no litter case variant)and the rest of the string is converted to lower case.if first is specified,it refers ti the first char index in the string to start modifyling.if last is specified,it refers to the char index in the string to stop at.
string totitle timing返回Timing
string totile TIMING返回Timing
String totile timing1返回tIming
String totitle tiMING13返回tImiNG
6.string replace string first last[newstring]
string replace"akg hdkdhk"15BBB返回aBBBkdhk
string replace"akg hdkdhk"15返回akdhk
string replace"akg hdkdhk"51返回原路的字符串
7.string match[-nocase]pattern string如果pattern匹配string,那么返回1,否则返回0.
8.string compare[-nocase][-length int]string1string2如果有-length参数,那么只比较前int个字符,有-nocase是忽略大小写。Returen-1,0,1,depending on whether string1is lexicographically less than,equal to,or greater than string2.
string equal?-nocsae??-length int?string1string2跟此相似,返回是0(不相等),1(相等),不会比较谁大谁小
9.string first string1string2[startindex]
在string2中从头查与string1匹配的字符序列,如果到,那么就返回
匹配的第一个字母所在的位置(0-based)。如果没有到,那么返回-1。如果有[startindex],则从这个值开始查。
string first a sdfdgadlgjadfda返回值是5
String first a sdfdgadlgjadfda6返回值是10
String last ab abdfdigabdkgkab返回值为13
10.string trim string[chars]返回值为:从string字符串的首尾删除掉了字符集合chars 中的字符后的字符串。如果没有给出chars,那么将删除掉spaces、tabs、newlines、carriage returns这些字符.
11.string map?-nocase?charMap string
Replaces characters in string based on the key-value pairs in charMap.charMap is a list of key value key value、、、as in the form returned by array get.each instance

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。