《TCL语言基础教程.pdf》由会员分享,可在线阅读,更多相关《TCL语言基础教程.pdf(22页珍藏版)》请在金锄头文库上搜索。
1、Tcl 语言参考 Tcl Tool Command Language 即工具命令语言 Tcl 念作 踢叩 tickle 是一种易学易用易 于扩展的脚本语言 实际上包 含了两个部分 一个语言和一个库 首先 Tcl 是一种简单的脚本语言 主要使用于发布命令给一些交互程序如文本编辑器 调 试器和 shell 它有一个简单 的语法和很强可扩充性 Tcl 可以创建新的过程以增强其内建命令的能力 其次 Tcl 是一个库包 可以被嵌入应用程序 Tcl 的库包含了一个分析器 用于执行内建命 令的例程和可以使你扩充 定义新的过程 的库函数 应用程序可以产生 Tcl 命令并执行 命令可以由用户产生 也 可以从用户
2、接口的一个输入中读 取 按钮或菜单等 Tcl 和其他编程语言例如 C 不同 它是一种解释语言而非编译语言 Tcl 程序由一系列 Tcl 命令组成 在运行时由 Tcl 解释 器解释运行 Tcl 有大量的用 C C 编写的扩展用于提供 Tcl 本身不具有的功能 其中使用最广泛的 扩展是 TK TK 提供了各种 OS 平台下 的图形用户界面 GUI 连强大的 Python 语言都不单独提供自己的 GUI 而是提供接口适配到 TK 上 另一个流行的扩展包是 Exp ect 它提供了通过终端自动执行命令的能力 例如 passwd ftp telnet 等命令驱动的外壳 一 Tcl 程序基本结构 1 基本
3、语法 Tcl 有类似于 shell 的语法 一条 Tcl 的命令串包含了一条或多条命令用换行符或分号来隔开 而每一条命令包含了一个 域 field 的集合 域使用空白 空格或 TAB 分开的 第一个域是一个命令的名字 其它的 是作为参数来传给它 Tcl 解释器对一个命令的求值过程分为两部分 分析和执行 在分析阶段 Tcl 解释器运用 规则识别出命令并把命令分 成一个个独立的单词 同时进行必要的置换 substitution 在执行阶段 Tcl 解释器会把第 一个单词当作命令名 并查看这 个命令是否有定义 如果有定义就激活这个命令对应的 C C 过程 并把所有的单词作为参 数传递给该命令过程 让
4、命令过 程进行处理 Tcl 的命令名可以是内建的命令也可以是用户建的新命令 在应用程序中可用函数 Tcl CreateCommand 来创建新的命令 所有的参数作为字符串来传递 命令自己会按其所需来解释的参数的 另外关于 Tcl 的注释有一个特殊的要求 必须出现在 Tcl 解释器期望命令的第一个字符出 现的地方 才被当作注释 例如 set a 100 Not a comment set b 101 this is a comment 第一个例子中 及其后面的内容会被当作 set 的参数而非注释从而导致参数个数错误 但第 二个被解释为注释 因为 前面有一个分号 而分号和换行一样被看作是命令的分隔
5、符 脚步命令 1 eval 命令 eval 命令是一个用来构造和执行 TCL 脚本的命令 其语法为 eval arg arg 它可以接收一个或多个参数 然后把所有的参数以空格隔开组合到一起成为一个脚本 然后 对这个脚本进行求值 2 source 命令 source 命令读一个文件并把这个文件的内容作为一个脚本进行求值 例如 source e tcl c hello tcl 注意路径的描述应该和 UNIX 相同 使用 而不是 2 置换 Substitution set x 10 set y 100 x 上面命令执行后 y 的值是 100 x 而不是我们期望的110 这是因为 Tcl 解释器在分析
6、命令 时 把所有的命令参数都当作 字符串看待 所以 x 被看作了字符串 100 x 的一部分 如果我们想使用 x 的值 10 就 必须告诉 Tcl 解释器 我们在这里期望的 是变量 x 的值 而非字符 x 怎么告诉 Tcl 解释器呢 这就要用到 Tcl 语言中提供的置换功 能 Tcl 提供三种形式的置换 变量置换 命令置换和反斜杠置换 每种置换都会导致一个或多 个单词本身被其他的值所代替 置换 可以发生在包括命令名在内的每一个单词中 而且置换可以嵌套 1 变量置换 variable substitution 变量置换由一个 符号标记 变量置换会导致变量的值而非变量 标识符 本身被插入到字 符串
7、中 set x 10 set y 100 x 这时 y 的值还不是我们想要的值110 而是10 100 因为 Tcl 解释器把10 100看成是一个 字符串而不是表达式 y 要想得到值 110 还必须用命令置换 使得 Tcl 会把10 100看成一个表达式并求值 2 命令置换 command substitution 命令置换是由 括起来的 Tcl 命令及其参数 命令置换会导致某一个命令的所有或部分单词 参数 被另一个命令的结果所代替 set x 10 set y expr 100 x 这时 y 的值就是110了 这里当 Tcl 解释器遇到字符 时 它就会把随后的 expr 作为一个命 令名
8、从而激活与 expr 对应的 C C 过 程 并把 expr 命令中变量置换后得到的 10 110 传递给该命令过程进行处理 注意 中必须是一个合法的 Tcl 脚本 长度不限 中脚本的值为最后一个命令的返回值 例如 有了命令置换 实际上就表示命令之间是可以嵌套的 即一个命令的结果可以作为别的命令 的参数 3 反斜杠置换 backslash subtitution Tcl 语言中的反斜杠置换类似于 C 语言中反斜杠的用法 主要用于在单词符号中插入诸如换 行符 空格 等被 Tcl 解释器当作 特殊符号对待的字符 例如 set msg multiple space 如果没有 的话 Tcl 会报错 因
9、为解释器会把这里最后两个单词之间的空格认为是分隔符 于是发现 set 命令有多于两个参数 从而报错 加入了 后 空格不被当作分隔符 multiple space 被认为是一个单词 word 4 双引号和花括号 除了使用反斜杠外 Tcl 提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作 普通字符 而不作特殊处理 这就 要使用双引号和花括号 Tcl 解释器对双引号中的各种分隔符将不作处理 但是对换行符及 和 两种置换符会照常 处理 而在花括号中 所有特殊字符 都将成为普通字符 失去其特殊意义 Tcl 解释器不会对其作特殊处理 二 Tcl 变量数据类型 Tcl 只支持一种数据类型 字符串
10、string 所有的命令 命令的所有的参数 命令的结果 所有的变量都是字符串 请牢记 这一点 所有的东西都是字符串 然而字符串的实际解释是依赖于其所处上下文 它有三 种形式 命令 表达式和表 Tcl 变量根据其结构的复杂程度分为 简单变量 和 数组变量 两类 1 简单变量 一个 Tcl 的简单变量包含两个部分 名字和值 其中名字和值都可以是任意字符串 不过为 了更好的使用变量置换功能 变量名 最好按 C C 语言中标识符的命名规则命名 这是因为 Tcl 解释器在分析一个变量置换时 只把从 符号往后直到第一个不是字母 数 字或下划线的字符之间的单词符号作为要被置换的变量的名字 例如 set a
11、2 set a 1 5 set b a 1 在最后一个命令行 我们希望把变量 a 1的值付给 b 但是 Tcl 解释器在分析时只把 符号之 后直到第一个不是字母 数字或下划线 的字符 这里是 之间的单词符号 这里是 a 当作要被置换的变量的名字 所以 Tcl 解释器把 a 置换成2 然后把字符串 2 1 付给变量 b 这 显然与我们的初衷不同 当然 如果变量名中有不是字母 数字或下划线的字符又要用变量置换 可以用花括号把变 量名括起来 例如 set b a 1 2 数组变量 数组是一些元素的集合 Tcl 的数组和一般编程语言中的数组有很大的区别 在 Tcl 中 不 能单独声明一个数组 数组只能
12、和数组 元素一起声明 数组中数组元素的名字包含两部分 数组名和数组中元素的名字 Tcl 中数 组元素的名字 下标 可以为任何字符串 例如 set day monday 1 set day tuesday 2 3 重用结构及其操作 1 string 结构及其操作 因为 TCL 把所有的输入都当作字符串看待 所以 TCL 提供了较强的字符串操作功能 format 语法 format formatstring vlue value format 命令类似于 ANSIC 中的 sprintf 函数 它按 formatstring 提供的格式 把各个 value 的 值组合到 formatstring
13、中形成一 个新字符串 并返回 例如 set msg format s is d years old name age scab 语法 scan string formatsting varName varName scan 命令可以认为是 format 命令的逆 其功能类似于 ANSI C 中的 sscanf 函数 它按 formatsting 提供的格式分析 string 字 符串 然后把结果存到变量 varName 中 注意除了空格和 TAB 键之外 string 和 formatsting 中的字符和 必须匹配 例如 scan some 26 34 some d d a b regexp
14、 语法 regexp switchs exp string matchVar subMatchVar subMatchVar regexp 命令用于判断正规表达式 exp 是否全部或部分匹配字符串 string 匹配返回1 否则0 regexp 可以设置一些开关 switchs 来控制匹配的具体方式 如 nocase line 等 其中 表示这后面再没有 开关 switchs 了 即使后面有以 开头的参数也被当作正规表达式的一部分 如果 regexp 命令后面有参数 matchVar 和 subMatchVar 则所有的参数被当作变量名 如果 变量不存在 就会被生成 regexp 把匹配整个正
15、规表达式的子字符串赋给第一个变量 匹配正规表达式的最左边的子表 达式的子字符串赋给第二个变 量 依次类推 例如 regexp 0 9 a z there is 100 apples total num word 1 puts total num word 显示结果为 100 apples 100 apples 其他具体的正则表达式规则请参考 Tcl 语言手册 regsub 语法 regsub switchs exp string subSpec varname regsub 的第一个参数是一个整个表达式 第二个参数是一个输入字符串 这一点和 regexp 命令完全一样 也是当匹配 时返回1 否
16、则返回0 不过 regsub 用第三个参数的值来替换字符串 string 中和正规表达式匹 配的部分 第四个参数被认为是 一个变量 替换后的字符串存入这个变量中 例如 regsub there They live there lives their x puts x 显示结果为 They live their lives sting 语法 string subcmd arg arg 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如