Tcl 编程初步
编辑版本 : 1.5
日 期 :2004-3-2
著 者 :陈 涛
上海贝尔阿尔卡特有限公司
Tcl 编程初步
总目录
总目录............................................................................................................................................... I
例索引.............................................................................................................................................IV
表索引.............................................................................................................................................VI
图索引............................................................................................................................................VII
第 1 章.
2.3.1
2.3.2
2.3.3
2.3.4
TCL 基本知识................................................................................................................ 1
1.1 什么是 TCL ..............................................................................................................................1
TCL 自学工具...........................................................................................................................1
1.2
TCL 软件包 ..............................................................................................................................2
1.3
1.4
TCL 命令格式...........................................................................................................................2
1.5
TCL 脚本文件和 SOURCE 命令 ..................................................................................................3
1.6 可执行脚本文件(EXECUTABLE FILE)...........................................................................................3
1.7 获得帮助.................................................................................................................................4
1.7.1 Windows 系统.............................................................................................................4
1.7.2
Unix 系统......................................................................................................................4
第 2 章. 输出、赋值与替换 ........................................................................................................ 5
2.1
PUTS .........................................................................................................................................5
2.2
SET & UNSET ..............................................................................................................................5
2.3 替换 ........................................................................................................................................6
$...................................................................................................................................6
[] ..................................................................................................................................6
" " 和{} ..........................................................................................................................6
\...................................................................................................................................7
第 3 章. 数学表达式与 EXPR 命令 .............................................................................................. 8
3.1 数学和逻辑运算符..................................................................................................................8
3.2 数学函数.................................................................................................................................8
3.3 数学运算举例 .........................................................................................................................9
3.4
INCR 命令 ................................................................................................................................9
第 4 章. 字符串 ........................................................................................................................ 10
4.1 基本命令集 ...........................................................................................................................10
4.2
APPEND 命令..........................................................................................................................10
FORMAT 命令..........................................................................................................................10
4.3
format 命令说明...................................................................................................... 10
format 举例.............................................................................................................. 11
SCAN 命令 .............................................................................................................................12
BINARY 命令 ...........................................................................................................................13
SUBST 命令..............................................................................................................................14
STRING 命令 ...........................................................................................................................15
4.7.1
string 命令列表......................................................................................................... 15
4.7.2 字符串比较................................................................................................................ 16
4.7.3
string match 字符串匹配......................................................................................... 16
4.7.4 字符串替换................................................................................................................ 18
4.7.5 字符类别(class)测试................................................................................................. 18
4.7.6 字符串映射................................................................................................................ 19
4.3.1
4.3.2
4.4
4.5
4.6
4.7
i
第 5 章.
Tcl 编程初步
TCL 列表操作.............................................................................................................. 20
5.1 列表命令集 ...........................................................................................................................20
LIST 命令.................................................................................................................................20
5.2
CONCAT 命令.........................................................................................................................21
5.3
5.4
LAPPEND 命令 ........................................................................................................................21
LLENGTH 命令 .........................................................................................................................22
5.5
LINDEX 命令............................................................................................................................22
5.6
5.7
LRANGE 命令..........................................................................................................................22
LINSERT 和 LREPLACE 命令........................................................................................................22
5.8
LSEARCH 命令.........................................................................................................................23
5.9
LSORT 命令 .............................................................................................................................24
5.10
5.11
JOIN 与 SPLIT 命令...................................................................................................................24
FOREACH 控制结构 ................................................................................................................27
5.12
第 6 章. 数组............................................................................................................................ 28
6.1 数组的定义与格式................................................................................................................28
6.2 数组变量...............................................................................................................................29
6.3 多维数组...............................................................................................................................29
6.4 数组操作命令 .......................................................................................................................30
array get 命令......................................................................................................... 30
6.4.1
6.4.2
array names 命令.................................................................................................... 30
6.4.3 遍历数组................................................................................................................... 31
6.4.4 用数组定义结构........................................................................................................ 31
第 7 章. 控制结构命令 ............................................................................................................. 32
IF/ELSE 命令............................................................................................................................32
FOR 命令................................................................................................................................33
WHILE 命令 .............................................................................................................................33
BREAK 与 CONTINUE 命令 ........................................................................................................34
SWITCH 命令...........................................................................................................................34
CATCH 命令 ...........................................................................................................................35
ERROR 命令............................................................................................................................36
RETURN 命令...........................................................................................................................37
EXIT 命令 ................................................................................................................................37
第 8 章. 过程与作用域 ............................................................................................................. 38
8.1
PROC—过程定义命令 ...........................................................................................................38
8.2 作用域...................................................................................................................................40
8.2.1 过程的作用域............................................................................................................ 40
8.2.2 变量的作用域............................................................................................................ 40
UPVAR 命令............................................................................................................................42
8.3
8.4
RENAME 命令 .........................................................................................................................44
8.5 特殊变量...............................................................................................................................45
8.5.1 命令行参数................................................................................................................ 45
8.5.2
env--环境变量数组................................................................................................... 45
EVAL 命令 ..............................................................................................................................46
UPLEVEL 命令..........................................................................................................................48
第 9 章. 正则表达式(REGULAR EXPRESSIONS)................................................................... 49
9.1
REGEXP 命令 ..........................................................................................................................49
9.2
REGSUB 命令...........................................................................................................................51
9.3 正则表达式的语法................................................................................................................52
7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9
8.6
8.7
ii
Tcl 编程初步
9.3.1 分支(branch)和原子(atom).................................................................................... 52
9.3.2 基本语法................................................................................................................... 52
9.3.2.1 匹配字符........................................................................................................................................52
9.3.2.2 限定匹配........................................................................................................................................53
9.3.2.3 方括号表达式与字符集 .................................................................................................................53
9.3.2.4 匹配分支........................................................................................................................................54
9.3.2.5 量词(Qulifier)...........................................................................................................................54
9.3.2.6 子模式与匹配报告捕获 .................................................................................................................55
9.3.2.7 反斜杠引用....................................................................................................................................56
9.3.2.8 匹配优先级....................................................................................................................................56
9.3.3 高级正则表达式(AREs)......................................................................................... 57
9.3.3.1 反斜杠换码(escape)序列............................................................................................................57
9.3.3.2 归整元素(collating element).....................................................................................................57
9.3.3.3 等价类(equivalence class)........................................................................................................58
9.3.3.4 字符类(character class).............................................................................................................58
9.3.3.5 非贪婪量词....................................................................................................................................59
9.3.3.6 约束量词........................................................................................................................................59
9.3.3.7 回退引用........................................................................................................................................59
9.3.3.8 前瞻(lookahead).........................................................................................................................60
9.3.3.9 换行符敏感的匹配.........................................................................................................................60
9.3.3.10
嵌入式选项 ...............................................................................................................................60
9.3.3.11
扩展语法...................................................................................................................................60
9.3.4 语法小结................................................................................................................... 60
9.3.5 其它支持正则表达式的命令...................................................................................... 60
名字空间................................................................................................................. 62
创建名字空间 ...................................................................................................................62
用::限定符来使用变量和过程...........................................................................................62
名字空间的变量 ...............................................................................................................63
过程的进口与出口............................................................................................................64
内省(INTROSPECTION) .........................................................................................................65
名字空间命令集 ...............................................................................................................65
跟踪与调试............................................................................................................. 67
11.1 CLOCK 命令 ...........................................................................................................................67
clock clicks 命令...................................................................................................... 67
clock seconds 命令................................................................................................ 67
clock format 命令................................................................................................... 68
clock scan 命令....................................................................................................... 70
INFO 命令...............................................................................................................................71
info level .................................................................................................................. 72
info exists ................................................................................................................. 72
TRACE 命令 ............................................................................................................................73
trace variable......................................................................................................... 73
trace vdelete.......................................................................................................... 75
trace vinfo............................................................................................................... 75
脚本库与软件包...................................................................................................... 76
声明和使用软件包............................................................................................................76
12.1.1 软件包定位................................................................................................................ 76
12.1.2 声明软件包命令........................................................................................................ 76
12.1.3 加载软件包命令........................................................................................................ 76
12.1.4 自动加载与软件包索引............................................................................................. 77
12.1.5 用链接库提供软件包................................................................................................. 79
10.1
10.2
10.3
10.4
10.5
10.6
11.1.1
11.1.2
11.1.3
11.1.4
11.2.1
11.2.2
11.3.1
11.3.2
11.3.3
11.2
11.3
第 10 章.
第 11 章.
第 12 章.
12.1
iii
Tcl 编程初步
13.1
13.2
14.2
第 14 章.
14.1
12.2
12.3
第 13 章.
PACKAGE 命令集 ...................................................................................................................80
小结 ..................................................................................................................................80
文件操作与程序调用............................................................................................... 81
文件操作...........................................................................................................................81
13.1.1 文件I/O.................................................................................................................... 81
13.1.2 文件系统信息命令..................................................................................................... 82
glob 命令 .................................................................................................................................83
13.1.2.1
13.1.2.2
file 命令集.................................................................................................................................83
程序调用...........................................................................................................................85
13.2.1 用open 命令打开一个进程管道.............................................................................. 85
13.2.2 用exec 命令调用程序.............................................................................................. 87
13.2.3 pid 命令.................................................................................................................... 88
套接字与事件驱动编程简介.................................................................................... 89
套接字编程.......................................................................................................................89
socket 命令.............................................................................................................. 89
14.1.1
Client 端 socket 命令..............................................................................................................89
14.1.1.1
14.1.1.2
Server 端 socket 命令选项......................................................................................................90
14.1.2 用fconfigure 配置套接字........................................................................................ 90
14.1.3 C/S 编程举例............................................................................................................ 90
事件驱动编程 ...................................................................................................................93
14.2.1 after 命令................................................................................................................. 93
fileevent 命令.......................................................................................................... 96
14.2.2
14.2.3
vwait 命令................................................................................................................ 96
fconfigure 命令....................................................................................................... 97
14.2.4
fconfigure 语法.......................................................................................................................97
14.2.4.1
非阻塞 I/O................................................................................................................................98
14.2.4.2
14.2.4.3
缓冲 ..........................................................................................................................................98
参考文献...................................................................................................................................... 100
例索引
例 1-1 输出一段字符串的例子........................................................................................................ 2
例 1-2 source 命令的简单例子...................................................................................................... 3
例 2-1 输出一个词的例子 ............................................................................................................... 5
例 2-2 参数定义、赋值与参数值引用............................................................................................. 5
例 2-3 嵌套$用做替换操作 ............................................................................................................. 6
例 2-4 命令替换[]的例子 ............................................................................................................... 6
例 2-5 {}替换的例子........................................................................................................................ 6
例 2-6 \的例子................................................................................................................................ 7
例 2-7 不规范的续行...................................................................................................................... 7
例 3-1 数学运算举例....................................................................................................................... 9
例 4-1 append 命令的简单例子 ................................................................................................. 10
例 4-2 位置说明符的例子 ............................................................................................................. 11
例 4-3 format 命令的简单例子 .................................................................................................... 11
例 4-4 scan 命令的简单例子 ....................................................................................................... 12
例 4-5 体验 binary format 和 binary scan 的作用.................................................................... 13
例 4-6 binary 命令的简单应用..................................................................................................... 14
例 4-7 subst 命令的简单例子 ....................................................................................................... 14
例 4-8 string compare 和 string equal 进行字符串比较的例子............................................... 16
iv
Tcl 编程初步
例 4-9 字符串替换简单例子.......................................................................................................... 18
例 5-1 使用 list 命令创建列表 ....................................................................................................... 20
例 5-2 concat 命令的例子 .......................................................................................................... 21
例 5-3 lappend 命令简单例子 .................................................................................................... 21
例 5-4 llength 命令的一个简单例子 ............................................................................................ 22
例 5-5 lindex 命令的一个简单例子 .............................................................................................. 22
例 5-6linsert 和 lreplace 命令的例子.......................................................................................... 22
例 5-7 lsearch 命令的简单例子 ................................................................................................... 23
例 5-8 lsearch 与 lreplace 结合删除列表元素........................................................................... 23
例 5-9 lsort 命令简单的例子 ......................................................................................................... 24
例 5-10 split 命令例子 .................................................................................................................. 24
例 5-11 空元素与独立字符元素的 split 例子................................................................................ 24
例 5-12 用 ldel 删除指定元素....................................................................................................... 25
例 5-13 根据步长调整 MAC 地址值 ........................................................................................... 25
例 5-14 foreach 的简单例子:依次打印列表元素 ..................................................................... 27
例 5-15 具有多个值列表的 foreach 命令处理过程..................................................................... 27
例 6-1 认识数组 ............................................................................................................................ 28
例 6-2 混淆普通变量和数组时的错误例子 ................................................................................... 29
例 6-3 通过替换间接使用数组变量 .............................................................................................. 29
例 6-4 数组和列表互换................................................................................................................ 30
例 6-5 array names 的简单例子 ................................................................................................. 31
例 6-6 遍历数组的一个方法举例 .................................................................................................. 31
例 6-7 用数组来定义结构 ............................................................................................................. 31
例 7-1 if/else 控制命令的简单例子 ........................................................................................... 32
例 7-2 一个 for 循环................................................................................................................... 33
例 7-3 while 循环的例子 .............................................................................................................. 34
例 7-4 switch 命令的简单例子..................................................................................................... 34
例 7-5 switch 语句中不当注释引起的错误 ............................................................................... 35
例 7-6 用 catch 捕获命令错误信息............................................................................................. 35
例 7-7 error 命令的例子 ............................................................................................................... 36
例 7-8 用 return 命令从过程中返回 ............................................................................................. 37
例 8-1 带有默认参数的过程定义 .................................................................................................. 38
例 8-2 不定输入参数过程的例子 .................................................................................................. 39
例 8-3 参数名+参数值成对输入的过程定义................................................................................. 39
例 8-4 过程的定义 ........................................................................................................................ 40
例 8-5 变量的作用域..................................................................................................................... 40
例 8-6 全局变量与局部变量的关系 .............................................................................................. 41
例 8-7 用”::”来声明全局变量........................................................................................................ 41
例 8-8 upvar 命令的例子 ............................................................................................................. 42
例 8-9 通过 upvar 命令来传递数组 ............................................................................................. 44
例 8-10 用 rename 命令来取消一个命令.................................................................................... 44
例 8-11 打印命令行参数信息 ....................................................................................................... 45
例 8-12 用 eval 创建新命令的简单例子 ...................................................................................... 46
例 8-13 动态定义过程................................................................................................................... 47
例 8-14 uplevel 的简单例子 ........................................................................................................ 48
例 9-1 regexp 的简单例子........................................................................................................... 50
例 9-2 用 regsub 进行字符串替换的简单例子 ............................................................................ 51
例 9-3 匹配挂靠的简单例子 ......................................................................................................... 53
例 9-4 字符集匹配的例子 ............................................................................................................. 53
例 9-5 使用量词*和?不当引起的错误........................................................................................... 55
v
Tcl 编程初步
例 9-6 子模式捕获......................................................................................................................... 55
例 9-7 屏蔽子模式报告 ................................................................................................................. 55
例 9-8 子模式综合运用的例子:搜索脚本文件中定义的过程 ..................................................... 55
例 9-9 归整元素匹配字符串 ......................................................................................................... 58
例 9-10 字符类的简单例子 ........................................................................................................... 58
例 10-1 定义名字空间 Counter:.................................................................................................. 62
例 10-2 动态定义名字空间 ........................................................................................................... 62
例 10-3 限定名比较的简单例子.................................................................................................... 63
例 10-4 名字空间自动处理引用变量的归属................................................................................. 64
例 10-5 过程的进口与出口的简单例子 ........................................................................................ 64
例 10-6 namespace origin 命令例子 ........................................................................................ 65
例 11-1 计算系统时钟滴答数........................................................................................................ 67
例 11-2clock format 在 windows 上的简单例子....................................................................... 69
例 11-3 Tcl 识别的系统编码方式.................................................................................................. 69
例 11-4 消除 clock format 输出中的乱码 .................................................................................. 70
例 11-5 用 info 测试变量是否存在............................................................................................... 71
例 11-6 用 info level 命令控制过程的循环嵌套 .......................................................................... 72
例 11-7 用 trace variable 跟踪变量的简单例子 ........................................................................ 73
例 11-8 trace vinfo 的例子 ......................................................................................................... 75
例 12-1 auto_path 的内容与操作............................................................................................... 76
例 12-2 pkg_mkIndex 命令......................................................................................................... 77
例 12-3 简单的软件包加载的例子................................................................................................ 78
例 13-1 用 open 命令打开文件,并输入数据 ............................................................................. 82
例 13-2 lstat 和 stat 命令举例...................................................................................................... 84
例 13-3 用 open 命令打开只读进程管道 ................................................................................... 86
例 13-4 用 open 命令打开进程管道又一例................................................................................. 86
例 13-5 用 exec 处理管道与 I/O 重定向 ..................................................................................... 87
例 13-6 用 pid 命令检查进程 ID................................................................................................... 88
例 14-1 基于 socket 实现的 C/S(Client/Server)简单模型......................................................... 90
例 14-2 after 命令的简单应用 ..................................................................................................... 94
例 14-3vwait 命令的简单例子 ..................................................................................................... 97
表索引
表 3-1 数学与逻辑运算符 ............................................................................................................... 8
表 3-2 数学函数 .............................................................................................................................. 8
表 4-1 比较有用的字符串操作命令 .............................................................................................. 10
表 4-2 格式转换符 ........................................................................................................................ 11
表 4-3 格式标志符 ........................................................................................................................ 11
表 4-4 二进制转换类型................................................................................................................. 13
表 4-5 string 命令 ......................................................................................................................... 15
表 4-6 使用 string match 来匹配字符的结构.............................................................................. 16
表 4-7 字符类名目 ........................................................................................................................ 18
表 5-1 列表相关命令..................................................................................................................... 20
表 6-1 数组操作命令表................................................................................................................. 30
表 9-1regexp 选项 ....................................................................................................................... 50
表 9-2 AREs 的换码表................................................................................................................... 57
表 10-1namespace 命令............................................................................................................ 65
表 11-1 clock 命令....................................................................................................................... 67
表 11-2 clock format 的域描述符............................................................................................... 68
vi
Tcl 编程初步
表 11-3 clock format 特定于 UNIX 系统的域描述符.................................................................. 68
表 11-4 info 命令集 ...................................................................................................................... 71
表 12-1 pkg_mkIndex 命令开关选项.......................................................................................... 77
表 12-2 package 命令................................................................................................................ 80
表 13-1 文件操作命令................................................................................................................... 81
表 13-2 open 命令的 acess 变量说明 ........................................................................................ 81
表 13-3 file 命令集........................................................................................................................ 83
表 13-4 file stat 命令数组元素..................................................................................................... 85
表 13-5 重定向指示标识和说明.................................................................................................... 88
表 14-1 after 命令 ........................................................................................................................ 93
表 14-2 fconfigure 控制的 I/O 通道属性.................................................................................... 98
图索引
图 1 TclTour 界面............................................................................................................................ 1
图 2 启动 Tcl 交互界面.................................................................................................................... 2
图 3 交互界面.................................................................................................................................. 2
图 4 启动 Windows 上的 Tcl Help................................................................................................. 4
图 5 使用在另外一个 Tcl 文件中的过程 ....................................................................................... 39
图 6 regexp 匹配过程示意图....................................................................................................... 50
图 7 文件访问控制权限说明 ......................................................................................................... 82
图 8 进程管道................................................................................................................................ 85
图 9 C/S 界面................................................................................................................................ 93
vii