TCL 语言
- 基本命令
- 普通置换
set x 10
set y 100 + x
变量x = 10, 变量y = 100+x 而不是110
-
- 变量置换
set x 10
set y 100 + $x
变量x = 10, 变量y = 100 + 10,因为Tcl解释器把10+100看成是一个字符串而不是表达式; y要想得到值110,还必须用命令置换,使得Tcl会把100+10看成一个表达式并求值。
-
- 命令置换[]
命令置换是由[ ] 括起来的TCL命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所替代
[ ]中的脚本的值为 最后一个命令的返回值
set x 10
set y [expr 100+$x]//y = 110
-
- 反斜杠置换 空格需要加\反斜杠表示
set msg hello world
报错:没有“\” 认为空格为分隔符,multiple 与space为两个参数,因为TCL没有”;” 作 为分隔符的要求。
set msg hello\ world
正确:认为 “hello world” 为一个整体
-
- 其他置换
{} :花括号将所有的分隔符,置换符(\)都当成普通字符处理
“” :双引号对除了换行符,$, 中括号[]意外的分隔符不做处理
- 脚本命令
2.1 eval 命令
eval arg arg ...
接收一个或多个参数,然后把所有的参数以空格隔开组合到一起成为一个脚本,然后对这个脚本进行求值
2.2source 命令:
source e:/tcl&c/hello.tcl(例子)
读一个文件并把这个文件的内容作为一个脚本进行求值。注意路径的描述应该和UNIX相同,使用' / '而不是' \ '
- 语言命令
3.1简单变量
set a 2 //将2赋值给a
set a.1 5 //名字和值都可以是任何字符串
set b $a.1 //我们希望把变量a.1的值付给b,但是结果是 2.1
set b ${a.1} //强大的花括号,实现上一条的想法
incr b
puts $b
6.1
Tcl解释器在分析时只把 $ 符号之后直到第一个不是字母、数字或下划线的字符(这里是 '. ')之间的单词符号当作要被置换的变量的名字,所以TCL解释器把a置换成2,然后把字符串“2.1”付给变量b。这显然与我们的初衷不同。当然,如果变量名中有不是字母、数字或下划线的字符又要用变量置换,可以用花括号把变量名括起来。
3.2数组变量
set day(monday) 1
puts $day(1)
monday
set day(Tuesday) 2
puts $day(2)
Tuesday
数组是一些元素的集合。TCL的数组和一般编程语言中的数组有很大的区别。在TCL中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中数组元素的名字包含两部分:数组名和数组中元素的名字,Tcl中数组元素的名字(下标〕可以为任何字符串。
- 重构变量及其操作
4.1 format命令
set msg [format “%s is %d years old”$name $age ]
format命令类似于ANSIC中的sprintf函数,它按formatstring提供的格式,把各个value的值组合到formatstring中形成一个新字符串,并返回。
4.2 scan 命令
4.3 string
string命令具有强大的操作字符串的功能,并通过其中的subcmd来区别具体将要执行的string操作。
string length string
string range string first last
string index string charIndex
string tolower string [first] [last]
string replace string first last [newstring]
string equal [-nocase] [-length int] string1 string2
string match [-nocase] pattern string //如果pattern 匹配string,那么返回1,否则返回0.
string compare [-nocase] [-length int] string1 string2 //如果有 -length 参数,那么只比较前 int 个字符
string first string1 string2 [startindex] //在string2 中从头查找与string1匹配的字符序列,如果找到,那么就返回匹配的第一个字母所在的位置(0-based)。如果没有找到,那么返回-1。
string trim string [chars] //返回值为:从string字符串的首尾删除掉了字符集合chars中的字符后的字符串。如果没有给出chars,那么将删除掉spaces、tabs、newlines、carriage returns这些字符.
4.4 list
list [ value value...] //这个命令生成一个list,list的元素就是所有的value
concat list [list...] //这个命令把多个list合成一个list
llength list //返回list的元素个数
lindex list index //返回list的第index个(0-based)元素
lindex $a 2
-> 3
lrange list first last //返回list的第first (0-based)到第last (0-based)元素组成的串,如果last的值是end。就是从第first个直到串的最后
linsert list index value [value...?] //返回一个新串,新串是把所有的value参数值插入list的第index个(0-based)元素之前得到
lsearch $list1 pattern
返回list中第一个匹配模式pattern的元素的索引,如果找不到匹配就返回-1
append 命令比较简单,它将一段字符串连接到另一字符串尾部从而组成新的字符串。此命 令对变量直接修改。
set a hello
append a \ world
$a = hello word
lappend 在列表末端追加元素
lappend stings holle
lsort 列表排序
功能: 将列表按照一定的规则排序
开关: 缺省时默认按照ASCII码进行排序
-real 按照浮点数值大小排序
-unique唯一化,删除重复元素
全局变量和局部变量
对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除,所以称为局部变量;在所有过程之外定义的变量我们称之为全局变量。TCL中局部变量和全局变量可以同名,两者的作用域的交集为空:局部变量的作用域是它所在的过程的内部;全局变量的作用域则不包括任何过程的内部。这一点和C语言有很大的不同。如果我们想在过程内部引用一个全局变量的值,可以使用global命令。
引用概念
upvar [level] otherVar myVar otherVar myVar ...
upvar命令使得用户可以在过程中对全局变量或其他过程中的局部变量进行访问。upvar命令的第一个参数otherVar是我们希望以引用方式访问的参数的名字,第二个参数myVar 是这个过程中的局部变量的名字
proc temp { arg } { upvar $arg b set b [expr $b+2] }
proc myexp { var } { set a 4 temp a return [expr $var+$a] }
则: myexp 7 13
一旦使用了upvar 命令把otherVar 和myVar 绑定,那么在过程中对局部变量myVar 的读写就相当于对这个过程的调用者中otherVar 所代表的局部变量的读写。这上面的例子中,upvar 把$arg(实际上是过程myexp中的变量a)和过程temp中的变量b绑定,对b的读写就相当于对a的读写。
1. 判断变量是否存在
info exists varName