TCL脚本技术及用法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TCL内建命令
% % % % % % % % % % % % % % proc tgrep {pattern filename} { set ff [open result.txt w+] set f [open $filename r] while {[gets $f line]!=-1} { if {[regexp $pattern $line x]} { puts $ff $x flush $ff } } close $ff close $f } tgrep {.*(\d+\.\d+\.\d+\.\d+)} HUAWEI_1log.txt RouterIP:10.20.0.59
引言

TCL提供了C语言的调用接口,可以很容易地嵌入到C 程序中;由于TCL提供了与C的接口函数,所以可以 在C编写的应用中调用TCL的库函数,执行TCL的命令 或脚本。具体的工作有: ①创建TCL的解释器; ②执行TCL的命令或脚本; ③对返回代码进行处理; ④撤消TCL的解释器。
引言
基本的C程序结构如下: #include <stdio.h> #include <tcl.h> main() { Tcl_Interp *ip; // 定义解释器 int code; ip=Tcl_CreateInterp(); // 创建该解释器 code=Tcl_EvalFile(ip, "test.tcl"); // 执行文件“test.tcl” if(code!=TCL_OK) exit(1); // 是否成功 else exit(0); }
TCL内建命令
TCL解释器自身提供的一些命令: 变量 列表 控制结构 过程与作用域 字符串操作 文件访问 错误和异常 其他TCL命令
TCL内建命令


TCL支持两种类型的变量:简单变量和数组。简单变量包含两 个部分:名字和值,名字把从$符号往后直到第一个不是字母、 数字或下划线的字符之间的单词符号作为要被置换的变量的名 字;数组只能和数组元素一起声明 。 相关命令:set unset append incr puts expr % set a 6 % append a 6 % incr a 1 % expr $a+3 % puts $a % unset a
TCL内建命令
TCL过程与作用域命令: TCL中过程是由proc命令产生 E.G:% proc add {x y } {expr $x + $y} proc命令的第一个参数是你要定义的过程的名字,第 二个参数是过程的参数列表,参数之间用空格隔开, 第三个参数是一个TCL脚本,代表过程体。 proc生成 一个新的内建命令,可以像固有命令一样调用: % add 1 2 %3
Tcl库
初始化 语法分析器 命令循环
应用程序
核心 命令
公用子程序
程序 自定义 命令
TCL命令扩展

扩展一个TCL命令大致可以分为两步:编写扩展命令 对应的C/C++过程,注册命令。对Tcl命令的扩展过 程一般按下图所示的步骤进行:
编写命令处理过程 创建Tcl解释器 进行初始化工作
Tcl初始化(Tcl_Init) 关联命令与命令处理过程 将有关的Tcl变量与C变量关联 指定启动的脚本

TCL语法
变量置换由一个$符号标记 E.G: % set x 10 % 10 % set y $x+100 % 10+100 命令置换是由[]括起来的TCL命令及其参数 E.G: % set y [expr $x+100 ] % 110 反斜杠置换 E.G: % set msg multiple\ space % multiple space。
TCL内建命令
引用:upvar % proc temp { arg } { % upvar $arg b % set b [expr $b+2] %} % proc myexp { var } { % set a 4 % temp a % return [expr $var+$a] %} 则: % myexp 7 % 13
TCL内建命令

控制结构命令:if、while、for、foreach、switch、break、 continue % set b " " % set i [expr [llength $a] -1] % while { $i>=0}{ % lappend b [lindex $a $i] % incr i -1 %}
TCL内建命令

错误和异常相关命令: catch command ?varName? error message ?info? ?code? return -code code ?-errorinfo info? ?-errorcode errorCode? ?string?
% catch {unset x} msg %1 % set msg % can't unset "x": no such variable
TCL内建命令

ຫໍສະໝຸດ Baidu
TCL还提供三种特殊的参数形式: 首先,你可以定义一个没有参数的过程。 % proc add {} { expr 2+3} 其次,可以定义具有缺省参数值的过程。 % proc add {val1 {val2 2} {val3 3}} { % expr $val1+$val2+$val3 %} 另外,TCL的过程定义还支持可变个数的参数,如果 过程的最后一个参数是args, 那么就表示这个过程支持 可变个数的参数调用。
//error //return //break
TCL内建命令
其他TCL命令: array info history time trace rename namespace

TCL命令扩展
TCL解释器由C过程库构成,并且能嵌入到C程序中, 所以程序员可以用C编写新的TCL命令,从而可以在 脚本中像TCL的命令一样使用该命令。
TCL简介


引言 TCL语法 TCL内建命令 TCL命令的扩展
引言
TCL指工具命令语言(Tool Command Language) ,主要包 括两个方面的内容:语法和函数库。


TCL语法简单,可扩充性强。 % set a 3 %3 TCL的函数库包含分析器、执行内建命令的例程及定义 新的过程的库函数。这组库函数提供了丰富的扩充函数, 允许用户编写新的命令解释程序,加入TCL 的解释器中;
引言


TCL运行环境:Windows/Unix/Linux TCL版本:tcl8.5(最高版本) 运行文件:tclsh85.exe wish85.exe: 包括tcl和tk两个部分 文本编辑器:NotePad \ TextPad \ UltraEdit
TCL语法
TCL语法是TCL解释器对TCL命令进行分析执行的规则 的集合。
TCL内建命令
proc do {varName first last body} { global errorInfo errorCode upvar $varName v for {set v $first} {$v <= $last} {incr v} { switch [catch {uplevel $body} string] { 1 {return -code error -errorInfo $errorInfo \ -errorcode $errorCode $string} 2 {return -code return $string} 3 return } } }


在分析阶段 TCL解释器将TCL命令分成一个个的单词,第 一个单词是命令名,其余单词是命令的参数,单词之间用 空格或Tab键隔开,同时进行必要的置换。 在执行阶段TCL解释器根据第一个单词查找该命令是否有 定义,有的话就激活该命令所对应的C/C++过程,并将所 有的参数传递给该命令过程,通过命令过程进行处理。 % set a 3 % set b $a %3
TCL内建命令
文件访问命令: 文件名:TCL中文件名和我们熟悉的windows表示文件 的方法有一些区别:在表示文件的目录结构时它使用 ‘/’,而不是‘\’ 。 基本文件输入输出命令 :open gets read puts flush close 随机文件访问命令:seek tell eof 管理当前工作目录命令:pwd cd 文件操作和获取文件信息命令:TCL提供了两个命令 进行文件名操作:glob和file,用来操作文件或获取文 件信息。
TCL内建命令

过程内部引用一个全局变量的值,可以使用global命令。 E.G: % set a 4 %4 % proc sample { x } { % global a % incr a % return [expr $a+$x] %} % sample 3 %8
TCL内建命令

引用:upvar 命令语法: upvar ?level? otherVar myVar ?otherVar myVar ...? upvar命令使得用户可以在过程中对全局变量或其他过程中 的局部变量进行访问。upvar命令的第一个参数otherVar是 我们希望以引用方式访问的参数的名字,第二个参数 myVar 是这个过程中的局部变量的名字,一旦使用了upvar 命令把otherVar 和myVar 绑定,那么在过程中对局部变量 myVar 的读写就相当于对这个过程的调用者中otherVar 所 代表的局部变量的读写 。 upvar命令语法中的level参数表示:调用upvar命令的过程相 对于我们希望引用的变量myVar在调用栈中相对位置 。

TCL语法
注释

TCL中的注释符是‘#’,‘#’和直到所在行结尾的 所有字符都被TCL看作注释,TCL解释器对注释将不作 任何处理 。 E.G: %#This is a comment % set a 100 # Not a comment % wrong # args: should be "set varName ?newValue?" E.G: % set b 101 ; # this is a comment % 101
TCL语法
置换

TCL解释器在分析命令时把所有的命令参数当做字符 串对待,置换的作用是获取命令参数所对应的值,而 非命令参数所代表的字符串。 置换包括变量置换、命令置换和反斜杠置换。变量置 换传递的是变量的值,命令置换传递的是命令参数的 计算结果,反斜杠置换主要用于在单词符号中插入诸 如换行符、空格、[、$等被TCL解释器当作特殊符号 对待的字符。置换可以嵌套。
TCL内建命令

字 符串操作命令:string、format、regexp、regsub、 scan等 regexp ?switchs? ?--? exp string ?matchVar?\ ?subMatchVar subMatchVar...? % regexp {^((0x)?[0-9a-fA-F]+|[0-9]+)$} ab %1 % regexp {^((0x)?[0-9a-fA-F]+|[0-9]+)$} 123j %0
TCL内建命令

列表命令:list concat lindex llength linsert lreplace lrange lappend lsearch lsort split join % linsert {1 2 {3 4}} 1 7 8 {9 10} % 1 7 8 {9 10} 2 {3 4}
处理返回结果 对TCL_OK与TCL_ERROR的处理 撤消解释器 删除命令
编写析构过程
TCL命令扩展
方法(一) 编写扩展命令函数: int Tcl_CmdProc(ClientData clientdata,Tcl_Interp* interp, int argc, char* argv[]); 注册命令函数: Tcl_CreateCommand(Tcl_Interp* interp, char* cmdName,Tcl_CmdProc* cmdProc,ClientData clientdata,Tcl_CmdDeleteProc* deleteProc) 缺点:TCL从外部应用到内部实现都是基于字符串的, 这样在涉及到类型转换时,需要在各种数据类型及其 字符串表示之间来回转换,效率比较低,加上TCL是 解释执行的,导致在利用TCL作较为大型的应用程序 时执行速度不够理想 。
相关文档
最新文档