tcl库函数(合集)
- 格式:pdf
- 大小:51.49 KB
- 文档页数:12
TCL基础教程——数学计算TCL是一种脚本语言,它可以用于编写各种应用程序和脚本。
TCL提供了丰富的数学计算功能,包括基本的算术运算、数学函数、随机数生成等。
本教程将介绍如何在TCL中进行数学计算。
1.基本的算术运算TCL支持常见的四则运算,可以使用加号"+"、减号"-"、乘号"*"、除号"/"进行加、减、乘、除运算。
例如:``` tclset a 10set b 5set c [expr $a + $b] # 加法运算set d [expr $a - $b] # 减法运算set e [expr $a * $b] # 乘法运算set f [expr $a / $b] # 除法运算```运行以上代码后,变量`c`的值为15,`d`的值为5,`e`的值为50,`f`的值为22.数学函数TCL提供了许多数学函数,可以对数字进行各种计算。
常用的数学函数包括求幂、开方、对数等。
例如:``` tclset x 2set y 3set z [pow $x $y] # 求x的y次幂set sqrtz [sqrt $z] # 对z进行开平方set logz [log $z] # 对z取对数```运行以上代码后,变量`z`的值为8,`sqrtz`的值为2,`logz`的值为2.0793.随机数生成TCL可以生成伪随机数,可以使用`rand`函数生成随机数。
例如:``` tclset randNum [expr rand(] # 生成一个0到1之间的随机数set randInt [expr int(rand(*10)] # 生成一个0到9之间的随机整数```运行以上代码后,`randNum`的值为0到1之间的随机数,`randInt`的值为0到9之间的随机整数。
4.数学常数TCL提供了一些常见的数学常数,如pi和自然常数e,可以直接使用。
tcl语言三个值取最大值的函数在Tcl语言中,我们可以使用一些方法来找到三个值中的最大值。
以下是一个示例函数,该函数接受三个参数,并返回它们中的最大值:```tclproc findMax {a b c} {set max $aif {$b > $max} {set max $b}if {$c > $max} {set max $c}return $max}# 示例用法set result [findMax 10 5 8]puts '最大值是: $result'```在上面的代码中,`findMax`函数接受三个参数 `a`、`b` 和 `c`,并将 `max` 初始化为 `a` 的值。
然后,我们使用两个 `if` 语句来比较 `b` 和 `c` 是否大于 `max`,如果是的话,我们将 `max` 更新为相应的值。
最后,我们返回 `max` 作为结果。
在示例中,我们调用了 `findMax` 函数,并传入三个数字 `10`、`5` 和 `8`,它返回的结果是 `10`,即这三个数字中的最大值。
然后,我们使用 `puts` 命令将结果打印出来。
这个函数可以很容易地适应更多的参数。
只需在函数定义和 `if` 语句中添加更多的条件即可。
在编写代码时,需要注意:1. 参数的顺序很重要。
根据代码的需求,可以更改参数的顺序。
2. 函数的名称和参数的数量应该根据实际需求来命名,以便在调用时清晰易懂。
3. 可以在函数中添加更多的逻辑和条件,以适应更多的情况。
希望这个示例能帮助你理解如何在Tcl语言中编写一个找到三个值中最大值的函数。
AI_TCL命令集合基本命令db2_connect建立数据库连接格式:db2_connect DB名user名password;例子:Set Conn [ db2_connect sccrm dbinst1 dbinst1]AI封装:proc aidb_connect {db username password} {return [db2_connect $db $username $password] }Db2_disconnect删除数据库连接格式:db2_disconnect 数据库连接句柄例子:db2_disconnect $dbhandleAI封装:proc aidb_disconnect {dbhandle} {db2_disconnect $dbhandle# ToDo: write log here}db2_open打开数据库连接格式:db2_open数据库连接句柄例子:db2_open $dbhandleAI封装:proc aidb_open {dbhandle} {set handle [db2_open $dbhandle]return $handle}db2_close断开数据库连接格式:db2_close数据库连接句柄例子:db2_close $dbhandleAI封装:proc aidb_close {dbhandle} {db2_close $handle# ToDo: write log here}db2_exec 执行SQL语句格式:db2_exec数据库连接句柄sql语句例子:db2_exec $dbhandle $sqlstmtAI封装:proc aidb_sql {handle sqlstmt} {db2_exec $handle $sqlstmt#ToDo: write log here}db2_fetchrow执行游标格式:db2_fetchrow 数据库连接句柄例子:db2_fetchrow $dbhandleAI封装:proc aidb_fetch {handle} {return [db2_fetchrow $handle] }db2_commit 事务提交格式:db2_commit 数据库连接句柄例子:db2_commit $dbhandleAI封装:proc aidb_commit {dbhandle} { db2_commit $dbhandle }db2_roll 事务回滚格式:db2_roll 数据库连接句柄例子:db2_roll $dbhandleAI封装:proc aidb_roll {dbhandle} {db2_roll $dbhandle}db2_msg错误信息格式:db2_msg 数据库连接句柄例子:db2_msg $dbhandleAI封装:proc aidb_errcode {dbhandle} {set rc [ db2_msg $handle]if {$rc !=0 && $rc!=100} {if {$rc < 0} {return "-1"} else {return "-2"}}return 0}db2_msg 错误信息格式:db2_msg 数据库连接句柄例子:db2_msg $dbhandleAI封装:proc aidb_errcode {dbhandle} {set rc [ db2_msg $handle]if {$rc !=0 && $rc!=100} {if {$rc < 0} {return "-1"} else {return "-2"}}return 0}其他封装表清空proc aidb_truncate {dbhandle handle table_name} {db2_exec $handle "alter table $table_name activate not logged initially with empty table"db2_commit $dbhandle}建表proc aidb_create_tmptable {dbhandle handle tablename tablelike tablespace tbsindex partitionkey} {db2_exec $handle "create table $tablename like $tablelike \in $tablespace \index in $tbsindex \partitioning key ($partitionkey) \not logged initially"db2_exec $handle "ALTER TABLE $tablename ACTIVATE NOT LOGGED INITIALLY \ LOCKSIZE TABLE"db2_commit $dbhandle}建临时表proc aidb_create_tmptable2 {dbhandle handle tablename fields tablespace tbsindex partitionkey } {db2_exec $handle "create table $tablename ($fields) \in $tablespace \index in $tbsindex \partitioning key ($partitionkey) \not logged initially"db2_exec $handle "ALTER TABLE $tablename ACTIVATE NOT LOGGED INITIALLY \LOCKSIZE TABLE"db2_commit $dbhandle}根据模板建表proc aidb_create_table_as { handle tablename tablelike } {db2_exec $handle "create table $tablename like $tablelike"}变更表名称proc aidb_rename {handle old_tablename new_tablename} {db2_exec $handle "rename table $old_tablename to $new_tablename" }日期增加月份proc ai_addmonths {date mon} {return "$date + $mon months "}日期减少月份proc ai_minusmonths {date mon} {return "$date - $mon months "}日期增加天数proc ai_adddays {date day} {return "$date + $day days"}日期减去天数proc ai_minusdays {date day} { return "$date - $day days" }字符转换成日期proc ai_to_date {date} { return "date('$date')";}日期转换成字符proc ai_to_char {date} { return "$date";}获取系统日期proc ai_sysdate {} {return "current date";}置空proc ai_nvl {s} {return "value($s)"}获取日期的天的值proc ai_day {s} {return "day($s)"}获取日期的月份proc ai_month {s} {return "month($s)"}获取日期的年份proc ai_year {s} {return "year($s)"}字符转换成整数proc ai_int {s} {return "int($s)"}获取两个日期之间的月份差异proc ai_months_between {date1 date2 } {return "year($date1)*12 + month($date1) - year($date2)*12 - month($date2)" }字符转换成double型proc ai_double {s} {return "double($s)"}获取日期的小时数proc ai_hour {s} {return "hour($s)"}字符转换成timestamp型proc ai_char_to_timestamp {s} {return "timestamp('$s')"}proc ai_int_to_int {} {return "integer"}proc ai_short_to_short {} {return "smallint"}proc ai_long_to_long {} {return "bigint"}proc ai_int_to_char {s} {return "char($s)"}。
tcl scan函数-回复Scan函数是Tcl中一个非常有用的命令,它用于在字符串中查找指定的模式并返回匹配的结果。
在本文中,我们将一步一步地回答关于Scan 函数的各种问题,从基本概念到高级用法。
首先,让我们来了解一下Scan函数的基本语法和用法。
Scan函数的基本语法如下:scan string pattern variable参数解释:- `string`:要用来查找的字符串- `pattern`:用于匹配的模式字符串- `variable`:用于存储匹配结果的变量下面是一个简单的例子来说明Scan函数的使用方法:set data "Hello World"scan data "s s" word1 word2这个例子中,我们将字符串"Hello World"存储在变量`data`中,并使用`s`模式将其分解成两个部分。
`word1`会存储"Hello",`word2`会存储"World"。
接下来,让我们深入了解Scan函数的不同模式和其对应的用法。
1. Simple Types(简单类型):- `c`:匹配单个字符- `d`:匹配有符号的十进制整数- `u`:匹配无符号的十进制整数- `x`:匹配十六进制整数- `o`:匹配八进制整数- `f`:匹配浮点数- `s`:匹配字符串- `e`:匹配指数标识的浮点数2. Modifiers(修饰符):- `*`:跳过匹配的内容- `l`:匹配长整数- `h`:匹配短整数- `.`:匹配小数点和数字- `[^...]`:匹配除了指定字符以外的任意字符现在,我们来看一个更复杂一些的例子:set data "My name is John. I am 25 years old."scan data "My name is s. I am d years old." name age在这个例子中,我们使用了字符串"My name is John. I am 25 years old.",并使用`s`模式匹配"John",`d`模式匹配"25"。
↖(^ω^)↗↖(^ω^)↗查看文章TCL语言的一些学习资料TCL语言Tcl tick 的构成-------Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。
是tool command language的缩写,发音为"tickle”,实际上包含了两个部分:一个语言和一个库。
首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。
它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。
其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。
应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。
但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。
在下面的清单中,将会发现第一个很常见的示例程序,它是用Tcl 实现的。
这是一个完整的脚本:第一行命令调用tclsh 环境,第二行命令执行实际工作。
用您所选择的文本编辑器创建该脚本,输入chmod +x hello.tcl 使之成为可执行文件,然后执行它以测试您这件“作品”。
~/tcltk$ cat hello.tcl#!/usr/bin/tclshputs stdout {Hello, World!}~/tcltk$ ./hello.tclHello, World!Tcl 和Tk 是解释型的、可扩展脚本语言。
与BSD 许可证十分相似,该许可证允许在任何情况下自由使用该软件,只要在所有副本中保留该版权并且在任何分发中一字不差地传递通告。
这个许可证条款使Tcl/Tk 成为自由软件。
Tcl/Tk 是一种解释型环境。
可以通过添加预编译的C 函数来扩展Tcl 解释器,可从Tcl 环境内部调用Tcl 解释器。
可以为特定目的或一般的以及广泛使用的而定制这些扩展。
tcl中的if跟正则表达式Tcl中的if语句和正则表达式Tcl是一种脚本语言,它具有简单易学、灵活多样的特点,被广泛应用于各类软件开发项目中。
其中,if语句和正则表达式是Tcl中常用的两个功能强大的特性。
本文将针对这两个主题进行详细介绍和讨论。
一、Tcl中的if语句if语句是一种条件判断语句,用于根据给定的条件执行不同的代码块。
在Tcl中,if语句的基本语法如下所示:if {条件} {# 条件成立时执行的代码块} elseif {条件} {# 第一个条件不成立,但第二个条件成立时执行的代码块} else {# 所有条件都不成立时执行的代码块}if语句的条件可以是一个布尔表达式,也可以是一个变量或函数的返回值。
在Tcl中,字符串的非空和非零值都被视为真,而空字符串和零值被视为假。
因此,我们可以使用if语句来判断变量的值是否符合我们的预期,并根据不同的情况执行相应的操作。
下面是一个简单的示例,演示了如何在Tcl中使用if语句:set num 10if {$num > 0} {puts "变量num的值大于0"} elseif {$num < 0} {puts "变量num的值小于0"} else {puts "变量num的值等于0"}在上面的例子中,我们首先定义了一个变量num,并将其赋值为10。
然后使用if语句判断num的值,并根据不同的情况输出不同的结果。
由于num的值为10,所以输出的结果为"变量num的值大于0"。
二、Tcl中的正则表达式正则表达式是一种强大的模式匹配工具,可以用于在字符串中查找和匹配特定的模式。
在Tcl中,我们可以使用正则表达式来进行字符串的匹配和替换操作。
Tcl中的正则表达式使用的是RE库,它提供了一系列的函数和操作符,用于处理字符串的匹配和替换。
我们可以使用if语句结合正则表达式来判断一个字符串是否符合某种模式,并根据不同的情况执行相应的操作。
目 录75总结...................................................................54分析函数................................................................33命令生成和删除函数及结果处理函数...........................................22解释器的生成和删除及TCL 脚本的求值函数......................................21初始化函数.. (11)9TCL 库函数的最新情况....................................................108字符串操作函数.........................................................97Hash 表操作函数..........................................................76访问TCL 变量的函数.......................................................TCL库函数介绍(一)关键词:TCL摘要:本文旨在推广TCL的使用,通过分类介绍TCL的库函数的用法,让用户了解怎样利用这些库函数去编写TCL扩展命令。
为了让用户能方便地扩展TCL命令,TCL为用户提供了大量的库函数供用户使用,满足用户各方面的需要。
用户可以在用C\C++语言编写扩展的TCL命令过程或函数时,调用这些库函数。
要真正理解这些库函数的用法,最佳途径是参照一些例子,并实际使用。
在我的一篇文档《TCL的使用》中有一些这些函数的使用的例子。
下面分类对TCL的库函数进行介绍。
1初始化函数这组函数用于用户初始化应用。
系统学习TCL脚本入门教程版本:1. 0作者:次目录1TCL语法 (4)1.1 简介 (4)1.2 运行环境 (4)1.3 本文约定 (4)1.4 参考资料 (4)2引言 (5)2.1 第1课:简单文本输出 (5)2.2 第2课:给变量赋值 (5)2.3 第3课:命令的赋值与置换一 (6)2.4 第4课:命令的赋值与置换二 (7)2.5 第5课:命令的赋值与置换三 (7)2.6 第6课:算数运算 (8)2.7 第7课:文本比较-SWITCH应用 (9)2.8 第8课:数值比较-IF应用 (10)2.9 第9课:WHILE循环 (11)2.10 第10课:FOR循环和INCR (11)2.11 第11课:过程PROC (12)2.12 第12课:过程PROC的参数定义 (13)2.13 第13课:变量的作用域 (13)2.14 第14课:LIST结构 (14)2.15 第15课:LIST项的增删改 (15)2.16 第16课:更多LIST相关 (16)2.17 第17课:字符串函数 (17)2.18 第18课:更多字符串函数 (17)2.19 第19课:修改字符串函数 (20)2.20 第20课:正则表达式 (21)2.21 第21课:更多正则表达式 (22)2.22 第22课:数组 (24)2.23 第23课:更多数组相关 (25)2.24 第24课:文件存取 (28)2.25 第25课:文件信息 (30)2.26 第26课:TCL中的子进程调用-OPEN & EXEC (33)2.27 第27课:命令或者变量是否存在-INFO (34)2.28 第28课:解释器状态-INFO (35)2.29 第29课:过程信息-INFO (36)2.30 第30课:模块化-SOURCE (37)2.31 第31课:建库-UNKNOWN & INFO LIBRARY (38)2.32 第32课:创建命令-EV AL (40)2.33 第33课:在EV AL中应用FORMAT & LIST (40)2.34 第34课:不使用EV AL替换-FORMAT & SUBST (42)2.35 第35课:改变工作目录- CD & PWD (43)2.36 第36课:调试和错误-ERRORINFO & ERROR C ODE & CATCH (44)2.37 第37课:调试-TRACE (45)2.38 第38课:命令行参数和环境串 (46)2.39 第39课:TIME & UNSET (47)2.40 第40课:SOCKET & FILEEVENT & VWAIT (49)2.41 第41课:日期时间-CLOCK (51)2.42 第42课:I/O通道-FBLOCKED & FCONFIG (53)2.43 第43课:子解释器 (56)2.44 第44课:数据库操作 (57)2.45 第45课:函数或过程数组的输入和输出方法 (59)2.46 第46课:INFO的用法 (60)2.47 第47课:多线程 (61)2.48 第48课:解析XML (72)3跋 (75)1TCL语法1.1简介作为脚本语言,tcl语法简单而功能强大。
Tcl编程初步编辑版本: 1.5日期:2004-3-2著者:陈涛上海贝尔阿尔卡特有限公司Tcl 编程初步总目录总目录................................................................................ . (I)例索引................................................................................ .. (IV)表索引................................................................................ .. (VI)图索引................................................................................ . (VII)第 1 章. TCL基本知识................................................................................ .. (1)1.1 什么是T CL................................................................................ (1)1.2 T CL自学工具................................................................................. (1)1.3 T CL软件包................................................................................. (2)1.4 T CL命令格式................................................................................. (2)1.5 T CL脚本文件和SOURCE 命令................................................................................. .. (3)1.6 可执行脚本文件(E XECUTABLEF ILE).............................................................................. . (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)2.3.1 $.................................................................................. .. (6)2.3.2 []................................................................................. .. (6)2.3.3 " " 和{}................................................................................. .. (6)2.3.4 \.................................................................................. .. (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)4.3 FORMAT命令................................................................................. .. (10)4.3.1 format命令说明................................................................................. (10)4.3.2 format举例................................................................................. .. (11)4.4 SCAN命令................................................................................. .. (12)4.5 BINARY命令................................................................................. (13)4.6 SUBST命令................................................................................. (14)4.7 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)i Tcl 编程初步第 5 章. TCL列表操作................................................................................ (20)5.1 列表命令集................................................................................. (20)5.2 LIST命令................................................................................. . (20)5.3 CONCAT命令................................................................................. . (21)5.4 LAPPEND命令................................................................................. (21)5.5 LLENGTH 命令................................................................................. . (22)5.6 LINDEX命令................................................................................. . (22)5.7 LRANGE命令................................................................................. .. (22)5.8 LINSERT 和LREPLACE命令................................................................................. .. (22)5.9 LSEARCH命令................................................................................. . (23)5.10 LSORT命令................................................................................. .. (24)5.11 JOIN与SPLIT命令................................................................................. . (24)5.12 FOREACH控制结构................................................................................. . (27)第 6 章. 数组................................................................................ .. (28)6.1 数组的定义与格式................................................................................. . (28)6.2 数组变量................................................................................. . (29)6.3 多维数组................................................................................. . (29)6.4 数组操作命令................................................................................. .. (30)6.4.1 array get命令................................................................................. (30)6.4.2 array names命令................................................................................. . (30)6.4.3 遍历数组................................................................................. . (31)6.4.4 用数组定义结构................................................................................. .. (31)第7 章. 控制结构命令................................................................................ .. (32)7.1 IF/ELSE命令................................................................................. . (32)7.2 FOR命令................................................................................. . (33)7.3 WHILE命令................................................................................. .. (33)7.4 BREAK 与CONTINUE命令................................................................................. .. (34)7.5 SWITCH命令................................................................................. (34)7.6 CATCH 命令................................................................................. (35)7.7 ERROR命令................................................................................. . (36)7.8 RETURN 命令................................................................................. (37)7.9 EXIT命令................................................................................. . (37)第8 章. 过程与作用域................................................................................ .. (38)8.1 PROC—过程定义命令................................................................................. .. (38)8.2 作用域................................................................................. (40)8.2.1 过程的作用域................................................................................. (40)8.2.2 变量的作用域................................................................................. (40)8.3 UPVAR命令................................................................................. . (42)8.4 RENAME命令................................................................................. . (44)8.5 特殊变量................................................................................. . (45)8.5.1 命令行参数................................................................................. . (45)8.5.2 env--环境变量数组................................................................................. (45)8.6 EVAL命令................................................................................. (46)8.7 UPLEVEL命令................................................................................. (48)第9 章. 正则表达式(REGULAR EXPRESSIONS) (49)9.1 REGEXP命令................................................................................. .. (49)9.2 REGSUB命令................................................................................. (51)9.3 正则表达式的语法................................................................................. . (52)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)第10 章. 名字空间................................................................................ (62)10.1 创建名字空间................................................................................. . (62)10.2 用::限定符来使用变量和过程................................................................................. . (62)10.3 名字空间的变量................................................................................. (63)10.4 过程的进口与出口................................................................................. (64)10.5 内省(INTROSPECTION)...................................................................... .. (65)10.6 名字空间命令集................................................................................. (65)第11 章. 跟踪与调试................................................................................ .. (67)11.1 CLOCK命令................................................................................. (67)11.1.1 clock clicks命令................................................................................. (67)11.1.2 clock seconds命令................................................................................. (67)11.1.3 clock format命令................................................................................. (68)11.1.4 clock scan命令................................................................................. . (70)11.2 INFO 命令................................................................................. . (71)11.2.1 info level.............................................................................. (72)11.2.2 info exists............................................................................. (72)11.3 TRACE命令................................................................................. . (73)11.3.1 trace variable........................................................................... (73)11.3.2 trace vdelete............................................................................ (75)11.3.3 trace vinfo.............................................................................. (75)第12 章. 脚本库与软件包................................................................................ . (76)12.1 声明和使用软件包................................................................................. (76)12.1.1 软件包定位................................................................................. . (76)12.1.2 声明软件包命令................................................................................. .. (76)12.1.3 加载软件包命令................................................................................. .. (76)12.1.4 自动加载与软件包索引................................................................................. (77)12.1.5 用链接库提供软件包................................................................................. . (79)iii Tcl 编程初步12.2 PACKAGE命令集................................................................................. . (80)12.3 小结................................................................................. .. (80)第13 章. 文件操作与程序调用................................................................................ (81)13.1 文件操作................................................................................. (81)13.1.1 文件I/O................................................................................ (81)13.1.2 文件系统信息命令................................................................................. .. (82)13.1.2.1 glob命令.......................................................................................... . (83)13.1.2.2 file命令集.......................................................................................... . (83)13.2 程序调用................................................................................. (85)13.2.1 用open命令打开一个进程管道 (85)13.2.2 用exec命令调用程序................................................................................. . (87)13.2.3 pid命令................................................................................. .. (88)第14 章. 套接字与事件驱动编程简介................................................................................ . (89)14.1 套接字编程................................................................................. .. (89)14.1.1 socket命令.................................................................................14.1.1.1 Client端socket命令.......................................................................................... .. (89)14.1.1.2 Server端socket命令选项.......................................................................................... (90)14.1.2 用fconfigure配置套接字................................................................................. . (90)14.1.3 C/S编程举例................................................................................. (90)14.2 事件驱动编程................................................................................. . (93)14.2.1 after命令................................................................................. .. (93)14.2.2 fileevent命令................................................................................. . (96)14.2.3 vwait命令................................................................................. . (96)14.2.4 fconfigure命令................................................................................. . (97)14.2.4.1 fconfigure语法.......................................................................................... .. (97)14.2.4.2 非阻塞I/O......................................................................................... .. (98)14.2.4.3 缓冲.......................................................................................... . (98)参考文献................................................................................ . (100)例索引例 1-1 输出一段字符串的例子.............................................................................例 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命令的简单应用.............................................................................例 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进行字符串替换的简单例子 (5)1例 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)。
目 录75总结...................................................................54分析函数................................................................33命令生成和删除函数及结果处理函数...........................................22解释器的生成和删除及TCL 脚本的求值函数......................................21初始化函数.. (11)9TCL 库函数的最新情况....................................................108字符串操作函数.........................................................97Hash 表操作函数..........................................................76访问TCL 变量的函数.......................................................TCL库函数介绍(一)关键词:TCL摘要:本文旨在推广TCL的使用,通过分类介绍TCL的库函数的用法,让用户了解怎样利用这些库函数去编写TCL扩展命令。
为了让用户能方便地扩展TCL命令,TCL为用户提供了大量的库函数供用户使用,满足用户各方面的需要。
用户可以在用C\C++语言编写扩展的TCL命令过程或函数时,调用这些库函数。
要真正理解这些库函数的用法,最佳途径是参照一些例子,并实际使用。
在我的一篇文档《TCL的使用》中有一些这些函数的使用的例子。
下面分类对TCL的库函数进行介绍。
1初始化函数这组函数用于用户初始化应用。
1.Tcl_Init函数原型: int Tcl_Init (Tcl_Interp *interp)参数interp是一个指向TCL解释器的指针。
Tcl_Init函数只作一些简单的初始化工作,没多大的用处。
不过,用户一般需要提供自己的初始化函数,原型与Tcl_Init一样,在这个函数中,要作应用的初始化工作,如注册自己的TCL扩展命令,生成自己需要的数据对象等。
这个函数必须在生成TCL解释器后才能调用。
生成TCL解释器可以调用Tcl_CreateInterp函数,另外Tcl_Main函数中也会自动生成TCL解释器。
2.Tcl_Main函数原型:void Tcl_Main (int argc, char **argv,Tcl_AppInitProc *appInitProc)如果用到这个函数的话,应该在你的C\C++程序的main函数中调用,它的前两个参数和main函数的两个参数一样,第三个参数是一个函数指针,指向一个初始化函数,其原型和Tcl_Init一样。
如果程序没有任何命令行参数,Tcl_Main调用appInitProc初始化函数,并启动一个TCL的命令解释循环,建立一个交互环境,等待你输入TCL命令和脚本并解释执行。
如果程序有命令行参数,那它先调用appInitProc函数作一些初始化工作,然后把第一个命令行参数作为TCL脚本文件名,并求值返回,其余参数不予理会。
2解释器的生成和删除及TCL脚本的求值函数这组函数提供生成和删除TCL解释器及对TCL脚本进行求值的功能。
每一个TCL应用,都必须拥有至少一个TCL解释器,事实上几乎所有的TCL库函数都有一个指向TCL解释器的指针的参数。
每一个扩展的TCL命令都和特定的TCL解释器相关联,只有在对该命令进行了注册的TCL解释器中,这个命令才是有效的,才能被解释执行。
1.Tcl_CreateInterp函数原型:Tcl_Interp *Tcl_CreateInterp(void)这个函数生成一个新的TCL解释器,并返回指向这个解释器的指针。
2.Tcl_DeleteInterp函数原型:void Tcl_DeleteInterp(Tcl_Interp *interp)这个函数删除一个TCL解释器,并会触发用户定义的回调函数,作一些善后工作。
3. Tcl_Eval函数原型: int Tcl_Eval(Tcl_Interp *interp char *script)这个函数在解释器interp中求脚本script的值并返回执行情况。
结果和错误信息保存在interp->result中。
函数返回值表示执行情况,为以下五个值之一:TCL_OK :表示执行成功TCL_ERROR:表示执行过程中遇到了不可克服的错误TCL_BREAK:表示break命令被激活TCL_CONTINUE :表示conitinue命令被激活TCL_RETURN:表示return 命令被激活事实上所有int型的TCL库函数都以上述值为返回值,TCL_OK和TCL_ERROR最常用,后面三个只是当用户需要实现自己的控制流才会用到。
下面介绍的库函数就不再介绍返回值。
4. Tcl_EvalFile 函数原型:int Tcl_EvalFile(Tcl_Interp *interp, char *fileName)这个函数在解释器interp中求脚本文件fileName的值并返回执行情况。
结果和错误信息保存在interp->result中。
5. Tcl_GlobalEval函数原型:int Tcl_GlobalEval(Tcl_Interp *interp, char *script)这个函数在解释器interp中在全局层次上求脚本script的值并返回执行情况。
结果和错误信息保存在interp->result中。
6. Tcl_VarEval函数原型:int Tcl_VarEval(Tcl_Interp *interp, char *string, char *string,... (char *) NULL)这个函数具有可变个数参数,必须以NULL作为最后一个参数,标记参数结束,它把所有的字符串参数合并成一个,在解释器interp中求它的值并返回执行情况。
结果和错误信息保存在interp->result中。
3命令生成和删除函数及结果处理函数这组函数用于生成和注册用户自己定义的TCL扩展命令及管理TCL命令的结果。
用户只有自己用C\C++语言编写了定义TCL命令的函数或过程,并注册,才能被解释器所识别和使用。
这里还应该区分两个概念:TCL命令结果和定义命令的C\C++函数或过程的返回值。
命令结果是执行TCL命令后,TCL解释器返回的命令执行结果,形式为字符串;而定义命令的C\C++函数或过程的返回值指的是我们编写的用来定义TCL命令的C\C++函数或过程的返回值,这些返回值已经在Tcl_Eval函数的说明中介绍了。
TCL命令的结果需要我们在定义TCL命令的C\C++函数或过程中给出,如果我们希望TCL命令执行后返回某个值,只要把这个值以字符串形式存入interp->result中,TCL解释器就会在执行这个命令后返回这个字符串形式的值。
1. Tcl_CreateCommand函数原型:void Tcl_CreateCommand(Tcl_Interp * interp, char * cmdName,Tcl_CmdProc * cmdProc, ClientData clientData,Tcl_CmdDeleteProc * deleteProc)这个函数在解释器interp中生成一个命令,并把它注册到这个解释器。
这样这个命令在这个解释器中就可以和TCL固有命令一样使用。
函数的第一个参数指向TCL解释器,第二个参数是一个字符串,代表命令名,第三个参数是一个函数指针,指向你用C\C++写的定义该命令的函数或过程,第四个参数指向你希望传给你的函数或过程的数据对象,第四个参数也是一个函数指针,指向一个回调函数,当你删除这个命令时,解释器会自动激活这个过程。
tcl.h中对Tcl_CmdProc的定义如下:typedef int Tcl_CmdProc(ClientData clientData,Tcl_Interp *interp, int argc,char *argv[]);其中:typedef void * ClientData;每一个用C\C++写的定义命令的函数或过程必须为上面的形式:第一个参数实际上是一个void指针,可以指向任何数据类型,这里指向用户需要传给那些函数或过程的数据对象,第二个参数指向解释器,第三个参数代表这个命令的参数个数(包括命令名本身),第四个参数是一个字符串数组,其中保存各个参数的字符串形式的值。
返回值为整数,只能为 TCL_OK、TCL_ERROR 、TCL_BREAK、TCL_CONTINUE 、TCL_RETURN其中之一,这在上面已经介绍过。
2. Tcl_DeleteCommand函数原型: int Tcl_DeleteCommand(Tcl_Interp *interp, char *cmdName)这个函数从解释器中删除一个命令,同时激活该命令对应的回调函数。
我们在利用C\C++编写TCL扩展命令过程时,一般可以通过把interp->result指向一个字符串或使用 sprintf 函数来设置命令的执行结果。
但是interp->result的缺省大小只有200字节,如果命令结果太长就会出错。
因此TCL提供了以下库函数来供用户管理命令结果:3. Tcl_SetResult 函数原型:Tcl_SetResult(Tcl_Interp *interp, char *string,Tcl_FreeProc* freeProc)这个函数的第一个参数是一个TCL解释器,第二个参数是一个将作为命令结果的字符串,第三个参数是一个函数指针,定义如下:typedef void (Tcl_FreeProc)(char *blockPtr)第三个参数的值可以为:TCL_STATIC :这表示string是静态的,Tcl_SetResult只简单的把它的指针存入interp->result TCL_VOLATITLE:表示string会改变,Tcl_SetResult会把它复制到interp->result,如果string太长,会重新分配内存。
TCL_DYNAMIC:表示string是用malloc分配的内存,并成为TCL的一个属性:Tcl_SetResult 将把interp->freeproc设置 free 以释放内存。