《tcl入门培训》PPT课件_第1页
《tcl入门培训》PPT课件_第2页
《tcl入门培训》PPT课件_第3页
《tcl入门培训》PPT课件_第4页
《tcl入门培训》PPT课件_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Tcl Overview ppt1998 01 03 Tcl入门培训 文档结构 Tcl介绍 HelloWorld 程序及扩展变量数据类型特殊字符数据结构控制结构程序结构语法要点对oracle操作ktcl文件一些建议后附 我们为什么用Tcl Tcl是什么 1 ToolCommandLanguage2 TerminalControlLanguageTcl是一种解释型的脚本语言 脚本解释器为tclsh 同时它也是一个shell环境 Tcl和C语言有着天然的亲缘关系 即相近的数据类型与控制结构 通过规范的API 能够比较方便的用C进行Tcl的扩展开发 Tcl能做什么 1 Tcl首先是作为一种简单的命令脚本语言而发明 以便控制和调用各个系统命令 2 与C相似的数据类型与控制结构 使其具有处理高级事务的能力 3 强大的文本处理能力 4 扩展能力达到GUI 网络 OOP等各个方面 我们为什么用Tcl 1 确实好用 功能强大 从KAP加速引擎到html ktcl 标签 2 快速学习 快速开发 老套 一个著名的程序世界上最著名的程序是什么 猜一猜 是 HelloWorld 下面是tcl版的程序 设aiobs56 为Unix系统提示符 aiobs56 cathello tcl aitools bin tclshputs HelloWorld aiobs56 hello tclHelloWorld aiobs56 shell方式以上是以程序的方式运行 tcl也可以运行于shell的形式 提示符 aiobs56 tclsh puts HelloWorld HelloWorld exitaiobs56 老套 续 Tcl脚本程序的结构1 在第一行指定解释器 aitools bin tclsh或如下写法 bin sh thenextlinerestartsusingtclsh exectclsh 0 2 注释的标记为 如 Thisisacommentsentence3 句与句 包括注释句 之间以 换行 或 分隔如 Followingasentenceputs line1 puts line2 Anothercomment 老套 续 puts命令看tcl的帮助 是这样说 puts向一个channel 相当于C里的句柄 写这里的channel可以是标准输出 一个打开的文件 一个打开的socket 甚至一个打开的Unix管道等等 等等 puts命令用法puts nonewline channelId string两个 表示之间的内容为可选 如上文的puts HelloWorld 向 屏幕 标准输出 写字符串 可以写成putsstdout HelloWorld nonewline是puts命令的一个option 它的意思是 输出内容后不换行 另一个老套 第二著名的程序aiobs56 cathello2 tcl aitools bin tclshputs nonewline Pleaseinputyourname setName getsstdin Youcanwriteitas getsstdinNameputs Hello Name 运行aiobs56 hello2 tclPleaseinputyourname MarkHelloMark aiobs56 新的内容符号对 gets命令set命令 符号 另一个老套 续 新的内容在前一页 有一个语句 setName getsstdin 符号对 的意思是 执行里面的命令 用结果替换这个组合 类似于C语言中的函数调用 上文这个句子的含义是 把 getsstdin 的值赋给变量Name gets的语法 getschannelId varName gets从一个channel取一个行到指定变量 同时它本身也返回这个行 所以gets还有第二种用法 getsstdinName 变量 变量是程序的基础 变量 变量名 变量值变量名 任何字符串都可作为变量名 如下所示 皆可作变量名Name变量1 AVariable 甚至空格或一个 空 串也可以作为变量名 变量赋值 setNameMarksetLine HelloWorld set变量名值与gets类似 命令set同时也返回值 引号的作用是让里面的内容为一个整体 因为中间有空格 其本身不是实际数据 如果要把引号作为数据引用 在其前面用转义符号 变量 续 变量的值 变量的值以符号 加变量名来展开 如 Name 变量1 AVariable 注意 在展开变量名之前必须保证此变量已被赋过值 否则在展开时会报错 nosuchvariable 举例 请在一个tcl环境里逐一试试如下命令 setNameMark puts Name setxputs sety Name x Hello y 由于tcl是解释型语言 在执行每个句子前都要先展开变量 上文最后一行句子就形成一种动态代码的效果 由此类推 可以实现动态过程 动态调用等代码形式 在某些地方是很有用的 数据类型 tcl的数据类型实际上只有一种 字符串所以在tcl中的变量没有类型转换或类型匹配问题 所有的 数据 都是以字符串的形式存在 那么 tcl如何进行数值计算 我如何计算并输出一个小数 数值计算tcl是支持数值计算的 包括数学函数 不过仅能用在expr命令中 setx100 sety expr x 1 incry 2 exprdouble x sety expr x 2 3 exprabs sin x 数据类型 输出一个命令format 其格式串参数类似C语言 setz format Thisis 8 2f y Thisis230 00 特殊字符 有涵义的字符 展开变量的值 展开一个命令 或调用过程 的值 内容作为一个整体 里面支持 的作用 内容作为一个整体 但里面不支持 及转义字符的作用 转义符 让特殊字符失去特殊涵义 转为纯粹可现字符 同时让一些可现字符转为特殊字符 如 n t r等例子在tcl环境中逐一试试以下命令 setx100 puts x puts x puts x puts expr x 2 3 puts Itis expr x 2 3 puts Itis expr x 2 3 puts Itis expr x 2 3 n 数据结构 列 列是tcl里功能非常强大非常灵活的一种数据结构 1 各个值按序排列 setx listarg1arg2arg3 2 或者按指定分隔符拆分一个字符串 setStr 1 2 3 setx split Str 列的元素可以是任何东西 字符串 空格 空 甚至一个列 列的概念比较复杂 下面例子 体会一下 setx 1234 llength x split x setx 1234 llength x split x setx list123 4 llength x split x 数据结构 数组 数组提供一个或多个值到另一个值的映射 或者这种映射的集合 简单说 某个数组的某个下标对应某个值 和C语言不同的是 tcl里的数组下标可以是 任何 字符串 包括空格或 空 所以数组的下标对空格敏感 注意 试试下面命令 setData 1 1 0 setData 2 3 abc setData Name Mark setData Hello setData aspace setData MyName Mark puts Data Data MyName setData hello Data Name Data Data MyName puts Data hello Mark 数组还有很多相关的操作 可参见命令array 控制结构 条件分支 终于来到if语句了 没有if语句怎么能有程序 建议形式 if expr 或者 if expr1 elseif expr2 else 表达式的值应该为逻辑值 表达式支持逻辑运算 与C相似 例子if x Mark y 1 putsHello 控制结构 条件分支 续 一点体会1 等式一定要写两个等号2 如果表达式一端有字符串常量 一定用引号括起3 注释 设有如下代码if x Mark putsHello 如果想临时改条件 可否这样写 if x Mark if x John putsHello 试试便知 4 整个if是一个句子 里面必要的分隔符不能省 控制结构 循环 for循环按照C语言的教程 if语句后应该是for循环了 for start expr test condition nextorstep body for setx0 x 10 incrx puts xis x 循环里可以有break continue 实际上 for的语法形式很简单 你完全可以用C的语法来考虑它 表达式也可以是复合的 for setx0 sety10 x 3incry puts x y 在写程序时需要注意的是整个句子里 变量有的地方带 有的地方不带 这是经常容易笔误的地方 控制结构 循环 续 while循环while test condition body setx0while x 10 puts xis x incrx 在实际程序中 while用到较多的地方是处理文件 setfpIn open FileNamer while eof fpIn 1 setCurLine gets fpIn if CurLine continue 控制结构 循环 续 前面有一个和C程序不同的地方 如果文件已经读完最后一行 继续while eof fpIn 1 在C和tcl里条件都会通过但在句子setCurLine gets fpIn 里tcl会返回并设CurLine为文件的最后一行C会返回并设CurLine为空所以在tcl程序里在其后加上了如下判断 if CurLine continue 附 C里通常的写法如下 fgets CurLine MAXSIZE fpIn while feof fpIn fgets CurLine MAXSIZE fpIn 控制结构 循环 续 foreach循环foreach是tcl里常用的循环方法 因为它和list这个功能强大的数据结构有关系 foreachItemItemList body setNameList JohnMarkJackBill Gates foreachNameNameList puts Heis Name foreach的扩展 foreach NamePosition JohnEngineerMarkManager puts Nameis Position foreachName JohnMark Position EngineerManager puts Nameis Position 控制结构 循环 续 数据集循环我们经常需要从数据库里读取一批数据进行处理 这里也是一个循环的过程 目前 tcl支持对oracle和sybase的操作 setsqlline selectfield1 field2fromtable1where orasql DBHandle sqllineorafetch DBHandle CalledProc 1 2 每返回一个记录 以对应的字段域做参数调用过程CalledProc或者 orafetch DBHandle puts 1puts 2 直接把执行体写在后面 每返回一个记录 执行其后的操作 可以有break和continue 注意 符号及参数 的用法在执行体内好象不能写注释 会有语法错误 程序结构 一般形式 aitools bin tclsh8 0sourceOtherProgramFileglobalVaribles1 VariblesNloadLibraryFileprocProcName arg1arg2 argn globalVar1Var2 Var returnRetString if argc 0 puts Usage argv0FileInFileOut return 1 setSomeVar PorcNameArg1Arg2 Arg return0 程序结构 续 source可以把一个外部的tcl文件在此处展开 执行 我们大家熟知的一个文件就是etc aiip cfg 它里面其实就是一段tcl程序 设置了一个名为AIIP的数组global指定某些变量是全局可用的 在tcl里 主程序里的变量并不是全局可用的 必须在主程序或过程里用global说明后 才能在过程里引用 aiobs程序里经常在sourceaiip cfg后紧接着就是globalAIIPload加载外部函数库 比如oratcl tcl的oracle支持库 aiobs很多用C开发的代码都可以被tcl加载 只要符合一定的规则 这也是tcl和C亲缘关系的一个证明 proc说明一个子过程 后面接过程名 参数列表 执行体 需要注意的是 过程的参数列表应该和调用处的参数一致 但例外的是 如果过程的参数只写一个 它就可以以list的形式接收多个入口参数 程序结构 续 proc 续 procF1 arg1agr2arg3 procF2args setarg1 lindex args setSomeVar F1Arg1Arg2Arg3 setSomeVar F2Arg1Arg2Arg3 proc只能返回字符串 这是一个不太灵活的地方 如果只返回单个值还好说 反正tcl里只有一种数据类型 return回来就是了 在aiobs里 一个过程经常要一次返回多个数据 就象C里返回一个结构一样 如何实现 用list的方法 在调用返回的字符串里用lindex解出各个单元 procF1 arg1arg2arg3 setRetStringVal1lappendRetStringVal2 程序结构 续 proc 续 returnRetString setSomeVal F1123 setRetV1 lindex SomeVal0 setRetV2 lindex SomeVal1 注意 proc的调用是传值调用 在主程序调用是要给具体的数据或变量的值 proc支持递归调用 不知有多深 反正做个100 没问题 主程序只是为了整齐 前面的几个部分如source load proc等都写在文件的前部 实际上可以灵活些 只要在运行的逻辑顺序上不要发生 未定义的 就可以 主程序入口时会带来几个变量 常用的有数组env系统的环境变量本程序名argv0 程序结构 续 主程序 续 入口参数个数argc 不包括本程序名 与C不同 入口参数列argv 不包括本程序名 如果调用程序 aiobs hello tclMarkJohn那么在程序里 puts arg0 hello tclputs argc argc 2puts argv MarkJohn puts lindex argv0 Markputs lindex argv1 John 语法要点 append和lappendappend向一个变量里追加字符串appenda b和seta a b效果一样 但append效率更好一些 省内存 lappend向一个列里追加元素seta 123 lappenda4array数组操作太多的操作类型了 看看help吧 catch捕获tcl操作的错误if catch open someFilew fid putsstderr Couldnotopen someFileforwriting n fid exit1 如果操作正常 变量fid被设置成里面操作的返回值 If语句不成立 如果操作不正常 if语句成立 同时变量fid被设成操作的错误信息 这个命令很有用 因为一个普通的tcl命令会因为某种原因的错误使整个程序down 如果我们不想让程序停止 用catch来处理是个好办法 语法要点 续 clock时钟clockseconds返回一个以秒为单位的整型值clockformatClockValue formatFormatString把一个 秒 时间返回成指定格式的字符串 格式串的语法同C 参见helpclockformat clockseconds format Y m d H M S clockscan从一个 时间 字符串里返回 秒 时间 一般来说 tcl的版本越高 支持的时间 格式 越多 clockscan 12 31 2001 clockscan 20010821 低版本不支持clockscan 12 31 200123 10 0 clockscan WedFeb2112 03 102001 clockscan nextday base clockseconds clockscan nextmonth 用法太复杂了 要多实验多体会 语法要点 续 expr计算表达式 包括数学函数 数值类型转换 数值计算只能在expr里 它也支持数据类型转换例 setx100sety expr x 2 setz expr x 2 1 setzz expr x 00 1 setyy exprdouble x file可以取得文件系统的有关信息 执行有关操作 glob按返回符合指定条件的文件名list 语法要点 续 incr简单的计算变量的加减incrxincry 1info返回一些有关程序的信息 我常用于判断一个变量是否存在 if infoexistsVarName setVarName SomeVar join和splitsplit SomeString把一个字符串解成listsplit SomeString 以 为分隔符把一个字符串解成listjoin SomeList把一个list合成一个字符串join SomeList 以 为分隔符把一个list合成一个字符串 语法要点 续 list及相关操作listarg1 argn把各个参数合成一个listllength SomeList返回list的长度 元素个数 lindex SomeList0返回list的第一个元素lindex SomeListend返回list的最后一个元素 end是list操作的保留字lindex SomeList expr llength SomeList 1 什么意思 linsert SomeListIndex SomeVar在Index 元素位置 如上文0 end 处插入一个元素 lrange SomeListfirstlast从list的first位置到last位置返回一个子列 lreplace SomeListfirstlast SomeVar从list的first位置到last位置的元素替换成新值lsort option SomeList对list排序lsearch SomeList SomeVar在list里搜索是否有某元素 经常用到 join split foreach就不说了open打开文件或管道 简直和C一样 相关操作close flush puts gets read seek eof tell 语法要点 续 pid返回本进程的id 有用吗 我做后台程序时用过 regexp对字符串进行正则表达式分析如 setx01062501658regexp 010 xyzputs x y z scan从字符串里读数据 同C的语法scanstringformatvarName varName scan10 20 d sxyset和unsetset设置或初始化一个变量unset释放一个变量 有时很有用的 socket打开一个tcp连接 我没用过 但亚信肯定用了 比如短消息网关 语法要点 续 string对字符串操作 是tcl里最常用 常用的操作 stringfirststring1string2 startIndex 在string2的startInddex位置开始查找第一次匹配string1的位置 例如 stringfirsta0a23456789abcdef5 返回10stringindex SomeStrcharIndex返回SomeStr中charIdex处的字符 stringisclass SomeStr返回字符串的类型 低版本tcl不支持stringisdigit01062501658 返回1stringlength SomeStr返回字符串长度stringrange SomeStrfirstlast返回字符串中first到last部分stringtrim SomeStr Chars 在字符串的两头删除Chars集中的字符 如果Chars没有说明 则删除空格 tab 回车 换行 stringtrimleft SomeStr Chars 在字符串的左边删stringtrimright SomeStr Chars 在字符串的右边删注意 这三个trim可别弄混了 否则 语法要点 续 switch一个多分支的结构 和C差不多 操作很多 常用的形式 switch SomeVar 1 2 puts Thisis1or2 3 puts Thisis3 default puts Other 但不支持C中类似结构 case1 puts Thisis1 这里没有break case2 puts Thisis2 break case3 puts Thisis3 break 对oracle操作 初始化及连接loadlibOratcl25 sosetdbuser aiobs5 obs5ai AIOBS5 if catch oralogon dbuser logon puts connectedfailed checkyouroracleusernameandpassword exit1 if catch oraopen logon DBHandle puts opencursorfailed exit1 if catch oraopen logon DBHandle2 可以开多个事务puts opencursorfailed exit1 setDBSQLorasqlsetDBNEXTorafetchsetDBCOMMIToracommitsetDBCLOSEoraclose 对oracle操作 续 select操作setsql selectbms comstomer id bms customer name appendsql frombms customer DBSQL DBHandle sql DBNEXT DBHandle setId 1setName 2puts 2 或者procAproc IdName DBNEXT DBHandle Aproc 1 2 对oracle操作 续 其它操作setsql insertinto TableName appendsql field1 If catch DBSQL DBHandle sql errinfo puts somewrong errinfo DBCLOSE DBHandlereturn 1 DBCOMMIT DBHandle注意catch的应用 在实际应用中如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论