《tcl入门培训PPT课件》由会员分享,可在线阅读,更多相关《tcl入门培训PPT课件(45页珍藏版)》请在金锄头文库上搜索。
1、Tcl入门培训119-Tcl-Overview.ppt1998/01/03文档结构Tcl介绍“Hello World” 程序及扩展变量数据类型特殊字符数据结构控制结构程序结构语法要点对oracle操作ktcl 文件一些建议后附我们为什么用Tcl?Tcl是什么?1、Tool Command Language2、Terminal Control LanguageTcl是一种解释型的脚本语言。脚本解释器为tclsh,同时它也是一个shell环境。Tcl和C语言有着天然的亲缘关系,即相近的数据类型与控制结构;通过规范的API,能够比较方便的用C进行Tcl的扩展开发。Tcl能做什么?1、Tcl首先是作为
2、一种简单的命令脚本语言而发明,以便控制和调用各个系统命令。2、与C相似的数据类型与控制结构,使其具有处理高级事务的能力。3、强大的文本处理能力。4、扩展能力达到GUI、网络、OOP等各个方面。我们为什么用Tcl? 1、确实好用,功能强大:从KAP加速引擎到html(ktcl)标签。2、快速学习、快速开发。老套一个著名的程序世界上最著名的程序是什么?猜一猜:是“Hello World!”,下面是tcl版的程序(设aiobs56 为Unix系统提示符)aiobs56 cat hello.tcl#!/aitools/bin/tclshputs “Hello World!”aiobs56 hello.
3、tclHello World!aiobs56 shell方式以上是以程序的方式运行;tcl也可以运行于shell的形式(提示符%)aiobs56 tclsh% puts “Hello World!”Hello World!% exitaiobs56 老套(续)Tcl脚本程序的结构1、在第一行指定解释器#!/aitools/bin/tclsh或如下写法#!/bin/sh# the next line restarts using tclshexec tclsh $0 $ 2、注释的标记为#如:# This is a comment sentence3、句与句(包括注释句)之间以“换行”或“;”分
4、隔如:# Following a sentenceputs “line 1”puts “line 2” ; # Another comment老套(续)puts 命令看tcl的帮助,是这样说:puts 向一个channel(相当于C里的句柄)写这里的channel可以是标准输出、一个打开的文件、一个打开的socket、甚至一个打开的Unix管道等等、等等。puts 命令用法puts ?-nonewline? ?channelId? string 两个?表示之间的内容为可选。如上文的puts “Hello World!”向“屏幕(标准输出)”写字符串,可以写成puts stdout “Hello
5、 World!” -nonewline是puts命令的一个option,它的意思是“输出内容后不换行”另一个老套第二著名的程序aiobs56 cat hello2.tcl#!/aitools/bin/tclshputs -nonewline “Please input your name: ”set Name gets stdin ;# You can write it as : gets stdin Name puts “Hello, $Name!”运行aiobs56 hello2.tclPlease input your name: MarkHello Mark!aiobs56 新的内容符
6、号对“”gets 命令set 命令$ 符号另一个老套(续)新的内容在前一页,有一个语句: set Name gets stdin 符号对“”的意思是:执行里面的命令,用结果替换这个组合,类似于C语言中的函数调用。 上文这个句子的含义是:把“gets stdin”的值赋给变量Name。 gets 的语法:gets channelId ?varName? gets 从一个channel取一个行到指定变量;同时它本身也返回这个行,所以gets还有第二种用法: gets stdin Name 变量变量是程序的基础。变量:变量名、变量值变量名:任何字符串都可作为变量名,如下所示,皆可作变量名Name变量
7、1“A Variable” 甚至空格或一个“空”串也可以作为变量名。变量赋值:set Name Markset Line “Hello World!” set 变量名 值 与gets类似,命令set同时也返回值。 引号的作用是让里面的内容为一个整体(因为中间有空格),其本身不是实际数据;如果要把引号作为数据引用,在其前面用转义符号 变量(续)变量的值:变量的值以符号“$”加变量名来展开,如:$Name$变量1$“A Variable” 注意,在展开变量名之前必须保证此变量已被赋过值,否则在展开时会报错“no such variable”。举例,请在一个tcl环境里逐一试试如下命令:% set
8、Name Mark% puts $Name% set x puts% set y $Name% $x “Hello $y!”由于tcl是解释型语言,在执行每个句子前都要先展开变量,上文最后一行句子就形成一种动态代码的效果。由此类推,可以实现动态过程、动态调用等代码形式,在某些地方是很有用的。数据类型tcl 的数据类型实际上只有一种:字符串 所以在tcl中的变量没有类型转换或类型匹配问题,所有的“数据”都是以字符串的形式存在。 那么,tcl如何进行数值计算?我如何计算并输出一个小数?数值计算 tcl是支持数值计算的(包括数学函数),不过仅能用在expr 命令中% set x 100% set y
9、 expr $x + 1% incr y -2% expr double($x)% set y expr $x * 2.3% expr abs(sin($x)“数据类型”输出 一个命令format,其格式串参数类似C语言。% set z format “This is %-8.2f !” $yThis is 230.00 !特殊字符有涵义的字符 $ 展开变量的值 展开一个命令(或调用过程)的值 “” 内容作为一个整体,里面支持$ 的作用 内容作为一个整体,但里面不支持$ 及转义字符的作用 转义符,让特殊字符失去特殊涵义,转为纯粹可现字符;同时让一些可现字符转为特殊字符,如 n t r 等例子
10、在tcl环境中逐一试试以下命令% set x 100% puts $x% puts “$x”% puts $x% puts expr $x * 2.3% puts “It is expr $x * 2.3”% puts It is expr $x * 2.3% puts “It is expr $x * 2.3 n”数据结构- 列列是tcl里功能非常强大非常灵活的一种数据结构: 1、各个值按序排列% set x list arg1 arg2 arg3 2、或者按指定分隔符拆分一个字符串% set Str “1,2,3”% set x split $Str “,” 列的元素可以是任何东西,字符串
11、、空格、“空”、甚至一个列。列的概念比较复杂,下面例子,体会一下: % set x “1 2 3 4”% llength $x% split $x “ ”% set x “ 1 2 3 4”% llength $x% split $x “ ”% set x list 1 2 3 “” 4 % llength $x% split $x “ ”数据结构-数组数组提供一个或多个值到另一个值的映射,或者这种映射的集合: 简单说,某个数组的某个下标对应某个值,和C语言不同的是,tcl里的数组下标可以是“任何”字符串,包括空格或“空”(所以数组的下标对空格敏感,注意)。 试试下面命令:% set Data
12、(1) 1.0% set Data(-2.3) abc% set Data(Name) Mark% set Data() “Hello,”% set Data( ) “a space”% set Data(“My Name”) “Mark !” % puts “$Data() $Data(“My Name”)”% set Data(hello,$Data(Name) “$Data() $Data(“My Name”)”% puts $Data(hello,Mark)数组还有很多相关的操作,可参见命令 array控制结构-条件分支终于来到if语句了,没有if语句怎么能有程序? 建议形式:if e
13、xpr . . . 或者:if expr1 . . . elseif expr2 . . . else . . .表达式的值应该为逻辑值,表达式支持逻辑运算(与C相似)。例子if $x = “Mark” & $y = 1 puts Hello!控制结构-条件分支(续)一点体会 1、等式一定要写两个等号 2、如果表达式一端有字符串常量,一定用引号括起 3、注释,设有如下代码if $x = “Mark” puts Hello!如果想临时改条件,可否这样写?#if $x = “Mark” if $x = “John” puts Hello!试试便知。 4、整个if是一个句子,里面必要的分隔符不能省控
14、制结构-循环for 循环按照C语言的教程,if语句后应该是for循环了。for start_expr test_condition next or step body;for set x 0 $x10 incr x puts x is $x循环里可以有break ,continue。实际上,for 的语法形式很简单,你完全可以用C的语法来考虑它。表达式也可以是复合的:% for set x 0; set y 10 $x 3 & $y 13 incr x ;incr y puts $x - $y在写程序时需要注意的是整个句子里,变量有的地方带$,有的地方不带$,这是经常容易笔误的地方。控制结构-
15、循环(续)while 循环while test_condition body;set x 0while $x hello.tcl Mark John那么在程序里:puts $arg0 ;# hello.tclputs $argc ;# argc = 2puts $argv ;# “Mark John”puts lindex $argv 0 ;# Markputs lindex $argv 1 ;# John语法要点append 和 lappend append 向一个变量里追加字符串append a $b 和 set a $a$b 效果一样,但append 效率更好一些(省内存?)lappen
16、d 向一个列里追加元素set a “1 2 3”lappend a 4array 数组操作太多的操作类型了,看看help吧。catch 捕获tcl操作的错误if catch open $someFile w fid puts stderr Could not open $someFile for writingn$fidexit 1如果操作正常,变量fid被设置成里面操作的返回值,If语句不成立;如果操作不正常,if语句成立,同时变量fid被设成操作的错误信息。这个命令很有用,因为一个普通的tcl命令会因为某种原因的错误使整个程序down,如果我们不想让程序停止,用catch来处理是个好办法。
17、语法要点(续)clock 时钟clock seconds 返回一个以秒为单位的整型值clock format ClockValue -format FormatString 把一个“秒”时间返回成指定格式的字符串。格式串的语法同C,参见helpclock format clock seconds -format “%Y%m%d %H:%M:%S”clock scan 从一个“时间”字符串里返回“秒”时间。一般来说,tcl的版本越高,支持的时间“格式”越多。clock scan “12/31/2001”clock scan “20010821”;# 低版本不支持clock scan “12/31
18、/2001 23:10:0”clock scan “Wed Feb 21 12:03:10 2001”clock scan “next day” -base clock secondsclock scan “next month”用法太复杂了,要多实验多体会。语法要点(续)expr计算表达式,包括数学函数、数值类型转换。数值计算只能在expr里。它也支持数据类型转换例:set x 100set y expr $x * 2 set z expr $x * 2.1set zz expr $x.00 + 1set yy expr double($x)file可以取得文件系统的有关信息,执行有关操作。
19、glob按返回符合指定条件的文件名list语法要点(续)incr简单的计算变量的加减incr xincr y -1info返回一些有关程序的信息。我常用于判断一个变量是否存在:if !info exists VarName set VarName $SomeVar. . .join 和splitsplit $SomeString 把一个字符串解成listsplit $SomeString “,” 以,为分隔符把一个字符串解成listjoin $SomeList 把一个list合成一个字符串 join $SomeList “,” 以,为分隔符把一个list合成一个字符串语法要点(续)list 及
20、相关操作list arg1 argn 把各个参数合成一个listllength $SomeList 返回list的长度(元素个数)lindex $SomeList 0 返回list的第一个元素lindex $SomeList end 返回list的最后一个元素 ;# end是list操作的保留字lindex $SomeList expr llength $SomeList - 1 什么意思?linsert $SomeList Index $SomeVar 在Index(元素位置 ,如上文0,end)处插入一个元素。lrange $SomeList first last 从list的first位
21、置到last位置返回一个子列。lreplace $SomeList first last $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 对字符串进行正则
22、表达式分析如:set x 01062501658regexp “010(.*)” $x y zputs “$x $y $z”scan 从字符串里读数据,同C的语法scan string format varName ?varName .? scan 10,20 %d,%s x yset 和 unset set 设置或初始化一个变量unset 释放一个变量(有时很有用的)socket打开一个tcp连接,我没用过,但亚信肯定用了,比如短消息网关。语法要点(续)string 对字符串操作,是tcl里最常用。常用的操作:string first string1 string2 ?startIndex?
23、 在string2的startInddex位置开始查找第一次匹配string1的位置,例如:string first a 0a23456789abcdef 5 ;# 返回10string index $SomeStr charIndex 返回SomeStr 中charIdex处的字符。string is class $SomeStr 返回字符串的类型,低版本tcl不支持string is digit 01062501658 ;#返回1string length $SomeStr 返回字符串长度string range $SomeStr first last 返回字符串中first 到last部
24、分string trim $SomeStr ?Chars? 在字符串的两头删除Chars集中的字符,如果Chars没有说明,则删除空格、tab、回车、换行。 string trimleft $SomeStr ?Chars? 在字符串的左边删string trimright $SomeStr ?Chars? 在字符串的右边删注意:这三个trim可别弄混了,否则. . .语法要点(续)switch 一个多分支的结构,和C差不多。操作很多,常用的形式:switch $SomeVar 1 - 2 puts “This is 1 or 2 “3 puts “This is 3”default puts
25、“Other”但不支持C中类似结构:case 1: puts(“This is 1”); /* 这里没有break */case 2: puts(“This is 2”);break;case 3: puts(“This is 3”);break;对oracle操作初始化及连接 load libOratcl25.soset dbuser aiobs5/obs5aiAIOBS5if catch oralogon $dbuser logon puts connected failed,check your oracle user name and password exit 1if catch o
26、raopen $logon DBHandle puts open cursor failedexit 1if catch oraopen $logon DBHandle2 ;#可以开多个事务puts open cursor failed”; exit 1set DBSQL orasqlset DBNEXT orafetchset DBCOMMIT oracommitset DBCLOSE oraclose对oracle操作(续)select 操作 set sql “ select bms_comstomer_id, bms_customer_name ” append sql “ from b
27、ms_customer ”. . .$DBSQL $DBHandle $sql$DBNEXT $DBHandle set Id 1set Name 2puts 2. . . 或者proc Aproc Id Name . . .$DBNEXT $DBHandle “Aproc 1 2”对oracle操作(续)其它操作 set sql “ insert into $TableName ”append sql “ ( field1, .) ”. . .If catch $DBSQL $DBHandle $sql errinfo puts “some wrong, $errinfo”$DBCLOSE
28、$DBHandlereturn -1$DBCOMMIT $DBHandle 注意catch的应用。在实际应用中如果有大量数据操作,可以分批提交以加快速度。预编译操作$DBSQL $DBHandle update bms_subscription set bms_user_password =:user_password where bms_user_name = :user_name -parseonlyorabindexec $DBHandle :user_password $user_password :user_name $user_name ktcl 文件ktcl 文件实际上是html
29、文件,里面可以加入标签: 使用明细查询结果 proc days_of_month year month if info exists QUERY(bill_type) ;#从上一个页面传来参数,注意用法! set bill_type string trim $QUERY(bill_type) ;#变量在整个文件有效 else set :error_msg 参数bill_type未找到! :kap:loadpage error.ktcl puts “”;# tcl的输出是标准的html文本,由浏览器显示 return 一些编程建议代码说明文件头:摘要、版权、版本信息、其它(包定义)过程头:摘要、
30、参数、结果 缩进最好用4个空格缩进;如果是单行折返(即用连接的两行,后续行)缩进8个空格关于 最好在行末;在控制结构里对最好存在,哪怕里面只有一行if $tcl_platform(platform) = “unix” return就不如if $tcl_platform(platform) = “unix” return清晰的表达式if $x 22 & $y 22) & ($y = 47) 过程必须有returnDB2(OCI)ORACLE(OCI)TDB(OCI)DB2Tcl(libdb2tcl.so)ORATcl(liboratcl.so)TDBTcl(libtdb.so)AIDBTcl(a
31、idb_xxx.tcl)应用开发应用开发不同数据库OCI封装,*.SOTcl实现SQL封装,屏蔽差异TCL应用开发结构图应用开发环境设置# AIOMNIVISION ENVexport AIOMNIVISION=$HOME/aiomnivision/bin;export AGENTLOGDIR=$HOME/aiomnivision/log/applog export AGENTTRACEDIR=$HOME/aiomnivision/traceexport AITOOLS=$AIOMNIVISION/aitoolsexport DATABASE=db2 或oracle或TDB将$AITOOLS/
32、lib加入到系统环境变量中:SHLIB_PATHHP-UXLD_LIBRARY_PATHMP-RAS and SOLARIS (INTEL/SPARC)LIBPATHAIX将$AITOOLS/bin加入PATH中后附还有什么问题?多找点资料看看,很easy. 赠送精美图标1、字体安装与、字体安装与设设置置如果您对PPT模板中的字体风格不满意,可进行批量替换,一次性更改各页面字体。1.在“开始”选项卡中,点击“替换”按钮右侧箭头,选择“替换字体”。(如下图)2.在图“替换”下拉列表中选择要更改字体。(如下图)3.在“替换为”下拉列表中选择替换字体。4.点击“替换”按钮,完成。442、替、替换换模
33、板中的模板中的图图片片模板中的图片展示页面,您可以根据需要替换这些图片,下面介绍两种替换方法。方法一:更改图片方法一:更改图片1.选中模版中的图片(有些图片与其他对象进行了组合,选择时一定要选中图片本身,而不是组合)。2.单击鼠标右键,选择“更改图片”,选择要替换的图片。(如下图)注意:注意:为防止替换图片发生变形,请使用与原图长宽比例相同的图片。44PPT放映设置PPT放映场合不同,放映的要求也不同,下面将例举几种常用的放映设置方式。让让PPT停止自动播放停止自动播放1. 单击”幻灯片放映”选项卡,去除“使用计时”选项即可。让让PPT进行循环播放进行循环播放1.单击”幻灯片放映”选项卡中的“设置幻灯片放映”,在弹出对话框中勾选“循环放映,按ESC键终止”。