第一部分:TCL基本知识
一.简介
Tcl 表示工具命令语言(Tool Command Language),它是一种流行的脚本编制语言,最初由加州大学伯克利分校的 John Ousterhout 教授开发。John Ousterhout 打算将 Tcl 作为一种将其它程序组件粘合在一起的语言,既可以以同其它脚本语言相同的方式将 Tcl 用作交互式 shell/脚本解释器,也可以将其作为脚本解释器嵌入您自己的 C 应用程序。在这种方式下,它就变成了一种向您自己的程序中添加脚本编制控制的方法,并且它提供了一些接口,这些接口允许您用自己的以 C 语言实现的脚本命令扩展基本 Tcl 语言.
Tcl 还有各种扩展,诸如 Tk,UI 工具箱,以及 Expect,Expect 是一种扩展,用于自动化同其它基于 shell 的命令(例如 telnet 和 ftp)的交互。
Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。
Tcl包含了两个部分:一个语言和一个库。
  首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一 些互交程序如文本编辑器、调试器和shell。它有一个简单的语法 和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。
其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的 过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。 但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。
脚本语言的优势:
快速开发:脚本语言极大地简化了“开发、部署、测试和调试”的周期过程。 
容易部署:大多数脚本语言都能够随时部署,而不需要耗时的编译/打包过程。 
同已有技术的集成:脚本语言被Java或者COM这样的组件技术所包围,因此能够有效地利用代码。 
易学易用:很多脚本语言的技术要求通常要低一些,因此能够更容易地到大量合适的技术人员。 
动态代码:脚本语言的代码能够被实时生成和执行,这是一项高级特性,在某些应用程序里(例如JavaScript里的动态类型)是很有用也是必需的。 
二.TCL的语法规则
1.解释器
  在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。每一个 Tcl命令是在特定的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Interp。Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。
2.数据类型
  Tcl只支持一种数据结构:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请
牢记这一点,所有的东西都是字符串。 这是它比较有特点的方面字符串有三种形式:命令(command), 表达式(expresion)和表(list)。
三.TCL基本语法
一条tcl命令的基本语法为:
command arg1 arg2 arg3
其中command可以是内建过程也可以是用户建的新命令,如果是用户用户建的新命令应用程序中用函数Tcl_CreateCommand来创建。所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。命令的名字必须被打全,但 Tcl解释器不到一同名的命令时会用 unknown命令来代替。;
空格符用来分隔命令名和他的变元,换行符或者分号用来表示一条命令的结束.
    例如:
set a 22 //相当于C中的 a=22 a是一个变量这条命令分为三个域:1: set    2: a    3: 22
set使用于设置变量的值的命令,a、20 作为参数来传给它,a使它要操作的变量名,22是要付给的a值。
2.注释
和shell很象,第一个字母是"#"的Tcl字符串是注释。
3.变量
set命令用于将值赋给变量.它接受2个变元:第一个是变量名,第2个是值.变量名可任意长,并且可区分大小写;
在使用变量前无须对tcl变量进行声明;
可以通过美元符号语法来获取变量的值.
4.数字表达式
tcl解释器本身不对数学表达式进行计算,tcl只是完成分组,替换和命令的调用工作,而expr命令用来对数字表达式进行分析和计算.
5.替换和分组
5.1 在变量里面提到过的使用$符合来完成替换
5.2命令替换
当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分都被视为Tcl命令。
例如:
set a [set b "hello"]
  实现执行 set b "hello" 并用其结果来替换源命令 中的方括号部分,产生一条新命令
  set a "hello" //"hello" 为 set b "hello" 的返回值
最终的结果是b="hello" a="hello"
方括号没有分组作用
5.3反斜杠替换
用来引用对解释器来说具有特殊意义的字符,比如:你可以通过反斜杠引用形式指定一个纯粹的美元符合,花括号或者方括号.
如:set dollar \$foo
=>$foo
5.4 使用花括号和双引号进行分组
双引号和花括号被用来将多个单词组织成一个变元.双引号和花括号之间的差别就是,双引号允许在分组重出现替换操作,而花括号则会阻止这种替换的发生.这种规则适用于命令,变量和反斜杠替换.
如:set s hello
=>Hello
puts stdout "The length of $s is [string length $s]"
=>The length of Hello is 5
puts stdout {The length of $s is [string length $s]}
=>The length of $s is [string length $s]
5.5 分组在替换前进行
TCL语法分析器只对命令执行一遍分组和字符串替换操作.分组决定是在替换前完成的,这是TCL的一种
很重要的属性,它表明经过替换的值并不影响分组结果,因为分组决定已经作出了.
例如:
set x 7;set y 9
puts student $s+$y=[expr $x+$y]
=>7+9=16
四.总结
一. 命令综述
  1.一个命令就是一个字符串(string)。
  2.命令是用换行符或分号来分隔的。
  3.一个命令由许多的域组成。第一个于是命令名,其它的域作为参数来传递。
  4.域通常是有空白(Tab横向制表健 Space空格)来分开的。
  5.双引号可以使一个参数包括换行符或分号。三种子替换仍然发生。
  6.花括号类似于双引号,只是不进行三总体换。
  7.系统只进行一层子替换,机制替换的结果不会再去做子替换。而且子替换可以在任何一个域进行。
8.如果第一个非控字符是`#", 这一行的所有东西都是注释。
二.替换和分组
下面的规则总结了TCL解释器在调用一条命令之前所完成的基本分组和替换机制:
? 命令变元以空白符加以分隔,除非他们像下面所描述的这样使用花括号或者双引号进行分组.
? 使用花括号,{},进行分组会阻止替换操作.括号可以嵌套.解释器将会在分组中包括所有匹配左右括号之间的字符,其中包括换行符、分号和嵌套括号.用于分组的花括号(即,最外层的花括号)不包含在分组值中.
? 使用双引号,””,进行分组允许替换操作.解释器会将所有的内容包括在内,直到碰到另一个双引号为止,其中包括换行符和分号.分组用的双引号不包括在分组字符当中.可以通过反斜杠引用(如\”)将双引号包括在分组中.
? 分组决定是在替换之前作出的.这也意味着变量值或者命令结果并不影响分组.
? 美元符号,$,将会导致变量替换.变量名可以任意长,而且区分大小写.如果变量引用嵌套在其他字符串中,或是其中包含了除字母、数字和下划线之外的其他字符,那么可以通过${varname}的语法形式加以区分.
? 方括号,[],将会导致命令替换.括号中的内容都被当作一条命令看待,而且包括方括号在内的所有内容都将替换成命令的结果.这是嵌套是允许的.
? 反斜杠字符,\,用来引用特殊的字符.你可以认为这是另外一种形式的替换,这里反斜杠与后面的一个或一组字符将被替换成一个新字符.
? 替换操作可以发生在任何地方,除非使用花括号加以阻止.分组中的一部分可以是常量字符串,而别的部分又可以是替换所产生的结果,甚至命令名都可以受到替换的影响.
? 在调用命令之前只完成一遍替换,不再对替换结果进行第2遍解释.这条规则在你的变量值或命令结果中包含诸如空格、美元符合、方括号或花括号等特殊字符时就显得非常重要.因为子进行一遍替换操作,所有你不必担心这些值中得特殊字符会导致额外得替换
.
三.使用FAQ
? 一种常见的错误就是在使用花括号或双引号进行分组时忘记在变元之间插入空格符.因为空白符用作变元的分隔符,而花括号和引号只提供分组的功能.如果你忘记了这些空格符,就会出现”在封闭花括号或者双引号之后发现非期望字符”之类的错误.由于}与{直接缺少空格,所有下面的代码就是错误的:
if {$x > 1}{puts “x=$x”}
? 双引号只有在空白符之后出现时才被用于分组,这也就是说你可以将双引号包含在一个分组当中而无须使用反斜杠引用.这要求要有花括号或空白符来界定这个分组.不推荐使用这种晦涩难懂的功能
? 当使用双引号进行分组时,花括号的特殊作用将被关闭.替换会在双引号扩起来的分组中的任何地方发生.下一条命令中,变量仍然被替换了
如:set x xvalue;set y “foo {$x} bar”;
=> foo {xvalue} bar
? 当使用双引号进行分组时,其中的内嵌命令仍然可以使用双引号进行分组.
put “result [format “%f %f” $x $y]”
? 用做命令替换的方括号之间的空白符不是必须的.出于分组的考虑,解释器会把方括号之间的任何内容都作为当前分组的一部分.下面的代码将x设置为两条命令结果的连接,原因就是]和[之间没有空格.
set x [cmd1][cmd2]
?
当使用花括号或双引号进行分组时,换行苻和分号可以被忽略.他们会像其他字符一样包括在分组字符中.下面的代码将x设置为包含换行符的字符串:
set x “this is line one”
this is line two.
this is line three.
? 在进行命令替换过程中,换行符与分号的作用就是作为命令终止符.如果你有一条很长的嵌套在方括号中的命令,而且想在另一行上继续这条命令的话,就请在换行符前插入一个反斜杠.这在例1-9中已有示范.
? 当一个美元符号后面跟的是除字母、数字、下划线或左小括号之外的其他内容时,它就会被当作一个纯粹的美元符号.
第二部分:JACL介绍
一.Jacl简介:
Jacl 是流行的 Tcl 脚本语言的 Java 实现。使用 Jacl,您可以在 XML 或 XSL 中嵌入用脚本编写的功能。此外,由于其 Java 扩展,因此,您可以使用 Jacl 来同基于 Java 的 Apache 工具内的 Java 对象进行交互
Jacl 向 Java 开发人员提供了另外一种处理 XML 的方法。Jacl 是流行的脚本语言 Tcl 的一种 Java 实现,使用它您可以深入底层并向使用 Ant 编写的 XML 构建或使用 Xalan 和 Cocoon 生成的转换中添加功能。
除了实现大多数 Tcl 命令集之外,Jacl 还提供了一些其自己的 Tcl 命令,这些命令允许程序员同 Java VM 交互。这些额外的命令允许 Jacl 代码创建 Java 对象,调用其中的方法,调用静态方法,内省 Java 对象甚至将 Jacl 侦听器绑定到 Java 事件。这种在同一个脚本中同时使用 Tcl 和 Java 代码的能
力带来了许多可能性。试想为系统编写一套 Java 服务、组件或构件块。通过在同这些组件相同的 VM 中使用 Jacl,您可以以脚本方式执行和控制 Java 组件。
您也可以使用 Jacl 作为交互式 shell,在那里您可以以交互方式(也就是从通常的 shell 提示符中)创建 Java 对象并调用其中的方法
Jacl 是 Tcl 解释器的 Java 实现:无须安装 Tcl 解释器,您仅需一个 Java VM 以及相关的 Jacl jar 文件。Jacl 通过其 Java 特性提供了一种真正的跨平台的脚本语言
对于习惯了 Java 而又不想投入太多时间学习另外一种语言的程序员来说,Jacl 也是一种非常强大的通用脚本语言。Tcl 有相对清晰和简单的语法,Java 程序员可以以混合然后匹配的方式使用 Jacl:将 Jacl 用于那些脚本语言最适用的地方(简单文件处理、正则表达式解析、字符串替换、执行系统命令等等),并利用 Jacl 的 Java 扩展来访问完整的 Java API 以及重用现有的 API 知识。
二.Jacl安装
下载 jacl1.2.6 源代码压缩文档,解压缩/压缩/tar 该分发版,然后执行 README 中的构建指令。一旦配置并构建了 jacl,您将在平台构建目录内发现两个 jar 文件,jacl.jar 和 tcljava.jar。要在 UNIX 平台上运行交互式 Jacl shell,请运行 UNIX 平台构建目录下的 jaclsh。如果您运行的是 Windows,请使用清单 2 中的批处理文件。
您的环境必须将 jaclsh 文件的位置包含在其 PATH 里,并将两个 jar 文件包含在 CLASSPATH 里。(您甚至想要将 jaclsh 复制或符号链接到 /usr/local/bin。)
现在可以使用 Jacl 了
第三部分.TCL内建函数对字符串的处理
这部分主要描述有关字符串操作和简单模式匹配的内容.主要介绍的命令有:
1. string
2. append
3. format
4. scan
5. binary
字符串是tcl中的基本数据项,因此有大量用来操作字符串的命令并不奇怪.一个与之密切相关的主题就是模式匹配,其中通过将字符串与模式进行匹配可以是字符串的比较功能更强大.
一.string命令:
string命令实际上是一组操作字符串的命令,string的第一个变元决定了进行什么样的操作,如下面的例子计算得到一个变量值的长度:
set name “brent welch”
string length $name
=> 11
常用的字符串操作有
? equal操作
用法为:string equal?-nocase?str1 str2
? 字符串match
用法为:string match pattern str
? 大小写转换操作
tolower 、totitle及toupper.用法为:string tolower string ?first?last?
? 字符串清理操作
trim、trimright和trimleft.用法为:string trim string ?chars?
? 将string分裂成列表。缺省以空白为分隔符,也可通过splitChars来设定分隔符
split string ?splitChars?
? 执行字符串的比较,按 C strcmp 的方式。返回 -1, 0, or 1。
string compare string1 string2
? 在string
1种查string2的定义次出现的位置。未到返回-1
string first string1 string2
? 返回字符串string的长度
string length string
? 判断string是否能匹配pattern。pattern是以shell文件名的统配格式来给出
string match pattern string
? 返回字符串string中从first到last之间的内容
string range string first last
? 将string转换为小写
string tolower string
? 将string转换为大写
string toupper string
? 将string的左右空白去掉
string trim string
? 将string的左空白去掉
string trimleft string
? 将string的右空白去掉
string trimright string
FAQ:
使用expr来进行字符串匹配不可靠,建议不要使用,安全的比对方法为使用string compare和equal操作来进行字符串比对
? string is命令用来测试一个字符串是否属于某个特定的类.
? srting map命令根据字符映射对字符串进行转换,映射以输入、输出形式表示.
例如:sring map “food” {f p d 1}
=>pool
二.append命令
append varName value
append varName value value value ...
append命令接收一个变量名作为它的第一个变元,并把剩余的变元连接到该指定变量当前值的后面.这个变量如果事先不存在就会被创建
FAQ:
对于大字符串来说,addend命令很有效率
例如:
append i "some new stuff" 就比下面的方式速度快
set i " some new stuff "
三.format命令
format命令与C语言中的printf函数类似,它根据一种格式说明来格式化字符串:
字符串长度工具
format spec
spec变元包括文字和关键词.文字将原封不动地存在到结果中,而每个关键字会指示如何格式化对应的变元.使用百分号(%)来引入一个关键字,其后跟着0个或多个修饰符并使用一个转换限定符作为结尾.关键字的例子包括用于浮点数的%f、用于整数的%d以及用于字符串格式的%s.使用%%可以获取一个单一的百分号.对于每个变元来说,最为通用的关键字说明可以包括多达6个部分:
?
位置说明符
? 标志
? 字段宽度
? 精度
? 单词长度
? 转换字符
四.scan命令
scan命令根据格式规范描述来解析一个字符串并把值赋给变量.它返回成功完成的转换格式.该命令的通用形式为:
scan string format var ?var? ?var?....
scan中的格式几乎与format命令中的完全相同.不存在扫描格式%u.描述格式%c会将一个字符转换成它的十进制值.
scan格式包含有一种集合的概念.它使用方括号来界定一组字符.这个集合匹配拷贝到变量中的一个或多个字符.它使用横杠来指定一个区间.下面的例子扫描一个全部以小写字母组成的字段
scan abcABC {%[a-z]} result
=>1
set result
=> abc
五.binary命令
binary命令用于字符串和压缩的二进制表示形式之间的转换.binary format命令接收数值并根据模板进行压缩.例如:她可以用来在内存中格式化一

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。