TCL基本语法

TCL基本语法
TCL基本语法

1.命令之间必须用换行或者分号隔开,单词之间必须用空格或TAB 键隔开。

2.TCL 解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution); 在执行阶段,TCL 解

释器会把第一个单词当作命令名, 并查看这个命令是否有定义, 如果有定义就激活这个命令对应

的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。

3.赋值set,其有返回值,为所赋之值。

4.置换,分为变量置换,命令置换与反斜杠置换

.变量置换$,

.命令置换[],它把随后的单词当作一个命令,eg:[expr 1+1]。[]里可以放多个命令,但是其返回值为最后一个命令的返回值。

.反斜杠置换,用于单词中插入特殊字符,比如空格,换行,[,$,以及C语言中的\n,\v等。

5.双引号及大括号

在双引号中各种分隔符不起作用,但是对换行符,及$,[]两种置换会起作用。而在大括号中,所以特殊字符将失去其特殊含义。

6.注释

在TCL解释器期望出现命令的地方出现的#到行末的部分被当作注释,eg:%#comment 或者%set a b;#comment

7.变量

.变量最好按C\C++变量名要求,因为在置换时只把$往后第一个不是数字,字母,下划线的部分替换。当然,如果加上{}就另当别论了。

.TCL只支持关联数组。

8.相关命令

.set 赋值

.unset 它后面可以跟任意多个变量名,如果跟数组名则删掉整个数组。

.append 追加变量到一个文本型变量之后。

.incr 将一个数值加到一个整形变量上。

9.操作数

.与ANSI C一样。

10.数学函数

.expr arg?arg? 它把所有的参数组合到一起,作为一个表达式。

11.LIST

.list可嵌套定义

.concat list?list? 将多个list连接成一个

.index list index 返回list中给定序号的元素,eg:index {1 2 {3 4}} 2,下标从0开始

.llength list 返回list的元素个数

.linsert list index value?value? 将一个list插入另一个list指定的序号处eg:linsert {1 2} 1 3 4 5 .lreplace list first last? value value ...?如果无value,则代表删除。

.lrange list first last 返回first到last之间的元素,如果last指定为end,则代表末尾。

.lappend varname value?value? 把所有给定的value加到varname的后面

.lsearch ?-exact?-glob?-regexp? list pattern 返回list中第一个匹配模式pattern的元素的索引,如果找汪以匹配就返回-1。-exact表示精确匹配,-glob的匹配方式和string match命令的匹配方式相同,-regexp表示正规表达式匹配。

.lsort options? list按照选项的方式进行排序

-ascii(default) -dictionary(不考虑大小写,有数字的话当作整数来排序) -integer -real -increasing -descreasing -command command

.split string splitChars? 如果分隔符为一个空字符{},则按字符分开,如果没给出,则以空格为分隔符。

.join list joinString? 将list中所有元素合并到一个字符串中,中间以joinString分开,缺省的joinString是空格。

12.控制流

.if {test}{

...

}esleif {

..

}

注意:执行体的{应该放在一行的末尾,否则TCL解释器会认为if命令在换行符处已结束,另外,if和{之间应该有一个空格,不然TCL解释器会把if{作为一个整体当作一个命令名。

.while循环

.for循环,与C不同,它不用;隔开,而是用三个{}各自括起来。

.foreach

最基本的形式是foreach varName list body

也可以foreach varlist1 list1? varlist2 list2..?Body

eg:

set x {}

foreach i {a b c} {j k} {d e f g}{

lappend x $i $j $k

执行过程如下:

1,i=a j=d k=e,x={a d e}

2,i=b j=f k=g,x={a d e b f g}

3,i=c j={} k={} x={a d e b f g c {} {} }

.break continue

.switch options?string{pattern body?patternbody?..}

第一个可选参数是options,表示进行匹配的方式,TCL支持三种匹配方式:-exact方式,-glob 方式,-regexp方式,缺省情况表示-glob方式。

switch $x{

a -

b {incr t1}

c {incr t2}

default {incr t3}

}

a后面的-表示使用与下一个模式相同的脚本。一旦switch命令找到一个模式匹配,就执行相应的脚本,并返回脚本的值,作用switch命令的返回值。

.eval arg? arg? ...

它可以接收一个或多个参数,然后把所有的参数以空格隔开组合到一起成为一个脚本,然后对这个脚本进行求值。eg:%eval set a 2; set b 4;

.source 命令读一个文件并把这个文件的内容作为一个脚本进行求值。

source e:/tcl&c/hello.tcl

注意即使是在windows下,也应该使用UNIX下的/,而不是\

13.过程

类似于C中的函数

%proc add{x y}{expr $x+$y}

也可以用return语句,也可以有默认的参数和可变参数,如果参数的最后一个为args,则代表可变参数,可以用foreach来取得。也有局部变量和全局变量之分,在过程外定义的即为全局变量,如果在过程内要使用全局就是,应使用global命令。

eg:%proc sample{x}{

global a

incr a

return [expr $a+$x];

}

.upvar level? otherVar myVar?otherVar myVar...?

其作用相当于是指定别名,即引用。

level表示调用upvar命令的过程相对于我们希望引用的变量myVar在调用栈中相对位置。缺省为1。

14.文件

.open name ?access? access与我们熟悉的C语言类似,有r,r+,w,w+,a,a+

open 命令返回一个字符串用于表识打开的文件。TCL 有三个特定的文件标识:stdin,stdout 和stderr ,分别对应标准输入、标准输出和错误通道,任何时候你都可以使用这三个文件标识。gets fileId ?varName? 读fileId 标识的文件的下一行,如果命令中有varName忽略换行符。就把该行赋给它,并返回该行的字符数(文件尾返回-1),如果没有varName 参数,返回文件的下一行作为命令结果(如果到了文件尾,就返回空字符串)。

和gets类似的命令是read,不过read 不是以行为单位的,它有两种形式:

read ?-nonewline? fileId 读并返回fileId 标识的文件中所有剩下的字节。如果没有nonewline 开关,则在换行符处停止。

read fileId numBytes 在fileId 标识的文件中读并返回下一个numbytes 字节。

puts ?-nonewline? ?fileId? string puts 命令把string 写到fileId 中,如果没有nonewline

开关的话,添加换行符。fileId 默认是stdout。命令返回值为一空字符串。

puts 命令使用 C 的标准I/O 库的缓冲区方案,这就意味着使用puts 产生的信息不会立即出现

在目标文件中。如果你想使数据立即出现在文件中,那你就调用flush 命令:

flush fileId 把缓冲区内容写到fileId 标识的文件中,命令返回值为空字符串。

flush 命令迫使缓冲区数据写到文件中。flush 直到数据被写完才返回。当文件关闭时缓冲区数据会自动flush。

close ?fileId? 关闭标识为fileId 的文件,命令返回值为一空字符串。

OTCL

使用关键字Class定义一个类,eg:Class Animal

TCL中的类有一些公共的行为,包括:

.Alloc 创建一个新的实体。

.Create 如果没定义自己的Create函数,那么它是由默认的unknown过程调用的,其定义如下:Class instproc create {obj args} {

set h [$self info heritage]

foreach i [concat $self $h] {

if {[$i info commands alloc] != {}} then {

set args [eval [list $i] alloc [list $obj] $args]

$obj class $self

eval [list $obj] init $args

return $obj

}

}

error {No reachable alloc}

}

从代码可知,它将沿着继承链创建相应的实例,并调用相应的init过程。

.info 此过程用于查询当前的一些状态信息,它有如下的选项:

superclass 返回其父类列表

subclass 返回它的子类列表

heritage 返回它的继承列表

instances 返回属于此类的实体列表

instprocs 返回此类的过程列表

instcommands 返回所以的Tcl和c过程

instargs 返回Tcl过程的参数列表

instbody 返回Tcl过程的定义

instdefault 返回Tcl过程参数的默认值

.instproc为类添加成员函数,使用instvar为类添加成员变量。有一点需要注意的是,在一个函数中定义了成员变量,这虽然能保证此类中有这个成员变量,但是如果要在其他成员函数中使用,仍然要采用这种方式重新申明此成员变量。

eg: Animal instproc run {speed} {

$self instvar speed

set speed $speed

puts "Animal run with speed $speed"

}

Animal instproc run2 {} {

$self instvar speed

puts "run2 run with speed $speed"

}

superclass 指定其父类,eg:Class Tiger -superclass Animal

unknown 当没有匹配的方法时,它将被调用,一般会重载此函数,其默认实现如下,以完成Create:

Class instproc unknown {m args} {

if {$m == {create}} then {

error "$self: unable to dispatch $m" }

eval [list $self] create [list $m] $args }

Tcl语言基础教程

Tcl语言参考 Tcl("Tool Command Language",即工具命令语言;Tcl念作“踢叩” "tickle" )是一种易学易用易于扩展的脚本语言,实际上包 含了两个部分:一个语言和一个库。 首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些交互程序如文本编辑器、调试器和shell。它有一个简单 的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。 其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充 (定义新的过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读 取(按钮或菜单等)。 Tcl和其他编程语言例如C不同,它是一种解释语言而非编译语言。Tcl程序由一系列Tcl 命令组成,在运行时由Tcl解释 器解释运行。 Tcl有大量的用C/C++编写的扩展用于提供Tcl本身不具有的功能。其中使用最广泛的扩展是TK,TK提供了各种OS平台下 的图形用户界面GUI(连强大的Python语言都不单独提供自己的GUI,而是提供接口适配到TK上)。另一个流行的扩展包是Exp- ect,它提供了通过终端自动执行命令的能力,例如passwd, ftp, telnet等命令驱动的外壳。

一、Tcl程序基本结构 1、基本语法 Tcl有类似于shell的语法,一条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个 域(field)的集合,域使用空白(空格或TAB)分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。 Tcl解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,Tcl 解释器运用规则识别出命令并把命令分 成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,Tcl 解释器会把第一个单词当作命令名,并查看这 个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过 程进行处理。 Tcl的命令名可以是内建的命令也可以是用户建的新命令,在应用程序中可用函数Tcl_CreateCommand来创建新的命令。 所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。 另外关于Tcl的注释有一个特殊的要求:'#'必须出现在Tcl解释器期望命令的第一个字符出现的地方,才被当作注释。 例如: set a 100 # Not a comment

TCL脚本实例解读

TCL脚本实例解读 作者:杨帆、老卢 前言 Sigma的这段日子在技术方面感觉提高的方面可能就是脚本的编写吧,我感觉写一个可用的脚本,并不一定非的在于你对脚本有了多了解之后,然后再去实现一个切合实际的脚本,最主要是思路,当你对所需要使用的脚本工具有一定的理解(如:TCL),在一个实际环境,首先能有个明确的想法,想实现个具体的什么东西,怎么样的思路可以实现,大脑里具备了这些条件,就可以尝试去写一些脚本。当然了,在实现的过程中肯定会遇到这样或者那样的问题,但一般来说,基本都是一些对脚本语法以及命令不熟悉的原因造成,这些问题很好解决,可以跟熟悉脚本的同事讨论,来帮你解决当时的问题,所以,千万不要因为还没有开始,就将脚本看得非常困难,导致自己一直无法迈出第一步,其实有些东西还是比较容易实现的。所以在此将我写的几个脚本在此解读解读。 文档目的 这篇文档中所附带的脚本,主要是根据Sigma这边搭建的系统测试环境而撰写出来的,脚本内容可能与今后Sigma公司为我们所开发的系统测试脚本无关,当撰写完这几个脚本之后,各人感觉有些东西还是比较有价值的,因此本人将此脚本撰写为文档,将这些东西共享出来供大家分享、借鉴、参考,相信看完这篇文档,因该会提供很多切合实际测试的一些脚本开发思路。还有,这篇文档并非一篇解释TCL命令的文档,有许多脚本中的相关命令不熟悉的地方需要查找其它资料,部分命令只做了解释或者介绍。 感谢!:) 这些脚本的撰写过程中感谢小康同学与小井同学的帮助(很多地方错误的查找、以及提供了一些解决关键问题的命令,如果没有他们的帮助,这个脚本完成的难度就大了,有很多也是他们的功劳) 环境介绍 这里提到的环境主要介绍的是系统测试的物理网络TOP环境与逻辑网络TOP环境,因为脚本里面的内容跟这个具体环境有关: 物理网络TOP,物理网络TOP所描述的实际是所有测试PC与DUT连接的物理

TCL语言及其文件的认识、理解和编辑

TCL语言及其文件的认识、理解和编辑 欢迎大家指正和补充。 Tcl语法简介 Tcl是用于工具命令语言的一个解释器。它由作为基本命令解释器嵌入到工具(比如编辑器、调试器等)中的一个库包组成。Tcl提供了(a)用于简单的文本命令语言的分析器,(b)一组内置的实用命令,和(c)一个C 接口,工具通过它用特定于工具的命令增加内置命令。Tcl在与窗口组件库整合的时候特别有吸引力:它通过了提供变量、过程、表达式等机制增进了组件的可编程性;它允许用户编程组件的外观和动作二者;并且它在交互式程序之间提供一个简单但强力的通信机制 作为一种脚本语言,Tcl具有简单的语法 Tcl/Tk 的发明人John Ousterhout 教授在八十年代初,是伯克利大学的教授。在其教学过程中,他发现在集成电路CAD 设计中,很多时间是花在编程建立测试环境上。并且,环境一旦发生了变化,就要重新修改代码以适应。这种费力而又低效的方法,迫使Ousterhout 教授力图寻找一种新的编程语言,它即要有好的代码可重用性,又要简单易学,这样就促成了Tcl (Tool Command Language) 语言的产生。 Tcl最初的构想的是希望把编程按照基于组件的方法(component approach),即与其为单个的应用程序编写成百上千行的程序代码,不如寻找一个种方法将程序分割成一个个小的, 具备一定“完整”功能的,可重复使用的组件。这些小的组件小到可以基本满足一些独立的应用程序的需求,其它部分可由这些小的组件功能基础上生成。不同的组件有不同的功能,用于不同的目的。并可为其它的应用程序所利用。当然, 这种语言还要有良好的扩展性, 以便用户为其增添新的功能模块。最后,需要用一种强的,灵活的“胶水”把这些组件“粘”合在一起, 使各个组件之间可互相“通信”,协同工作。程序设计有如拼图游戏一样,这种设计思想与后来的Java 不谋而合。终于在1988 年的春天, 这种强大灵活的胶水- Tcl语言被发明出来了。 按照Ousterhout 教授的定义,Tcl是一种可嵌入的命令脚本化语言(Command Script Language)。“可嵌入”是指把很多应用有效,无缝地集成在一起。“命令”是指每一条Tcl 语句都可以理解成命令加参数的形式: 命令[参数1] [参数2] [参数3] [参数4] ...... [参数N] 脚本化是指Tcl为特殊的,特定的任务所设计。但从现在角度看,可以说Tcl是一种集C 语言灵活强大的功能与BASIC 语言易学高效的风格于一身的通用程序设计语言。 Tk (Tool Kit) 是基于Tcl的图形程序开发工具箱, 是Tcl的重要扩展部分。Tk 隐含许多C/C++ 程序员需要了解的程序设计细节, 可快速地开发基于图形界面Windows 的程序。据称, 用Tcl/Tk 开发一个简单的GUI 应用程序只需几个小时, 比用C/C++ 要提高效率十倍。需要指明的是这里所说的“窗口”是指Tcl定义的窗口,与X-Windows 与MS Windows 的定义有所不同,但它可完美地运行在以上两个系统上。 Tcl代表了“tool command language - 工具命令语言”。它由一个库包组成,程序可以把它用作自己的命令语言的基础。Tcl的开发由两项观察所推动。第一项观察是,通用可编程命令语言通过允许用户用命令语言写程序来扩展工具的内置设施,从而扩大了工具的能力。在强力的命令语言之中最众所周知的例子是UNIX shell[5] 和Emacs 编辑器[8]。在各自情况下,出现的有着不同寻常能力的计算环境,在很大程度上是因为能获得可编程的命令语言。第二个促成它的观察是交互式应用正在增长。在1970 年代晚期和1980 年代早期的分时环境中,几乎所有的程序都是面向批处理的。典型的使用交互式的命令shell 来调用它们。

SpirentTestcenter自动化测试脚本TCL

Spirent Testcenter 自动化测试脚本TCL -1 基本功能 2015-06-18 浏览(69) #!/bin/sh # exec tclsh "$0" ${1+"$@"} #----------------------------------------------------- # # #----------------------------------------------------- #引用STC API ,的路径 source {C:Program FilesSpirent CommunicationsSpirent TestCenter TestCenter } #开启日志,-logTo :日志保存路径,使用stdout为标准输 出; -loglevel :可选DEBUG、INFO 、WARN 和ERROR 四种;stc::config automationoptions -logTo "" -logLevel DEBUG #配置机框Ip 槽位端口号 set chassisAddress "" set slotPort1 "8/25" set slotPort2 "8/26" #创建一个项目

set ProjectA [stc::create project] #在项目ProjextA 下创建一个发送端口和一个接收端口 set TxPort [stc::create port -under $ProjectA] set RxPort [stc::create port -under $ProjectA] set portReturn [stc::config $TxPort -location "//$chassisAddress/$slotPort1"] set portReturn [stc::config $RxPort -location "//$chassisAddress/$slotPort2"] #配置端口类型,根据实际端口类型选择参数:Ethernet10GigFiber、Ethernet100GigFiber、Ethernet40GigFiber、Ethernet10GigCopper、EthernetCopper等; set ethernetFiber(1) [stc::create "Ethernet10GigFiber" -under $TxPort -Name "ethernetFiber 1"] set ethernetFiber(2) [stc::create "Ethernet10GigFiber" -under $RxPort -Name "ethernetFiber 2"] #在发送端口下创建StreamBlock(1)

TCL脚本基本语法

TCL基本语法 1语言简介 TCL缩短工具命令语言的形式。由加州大学伯克利分校的约翰Ousterhout设计它。它是一种脚本语言,由其自身的解释器,它被嵌入到开发应用程序的组合。 TCL最初在Unix平台中。后来移植到Windows,DOS,OS/2和Mac OSX。TCL非常类似于其他UNIX的shell语言,类似Bourne Shell (Sh), the C Shell (csh), the Korn Shell (sh), 和Perl。 它的目的是提供程序与其他程序,也是作为一个可嵌入的翻译相互作用的能力。虽然原来的目的是为了使程序能够进行交互,可以找到由Tcl/Tk 编写的完全成熟的应用。 1.1TCL特性 TCL的特点如下: 1、减少开发时间。 2、功能强大和简单的用户界面工具包整合传统知识。 3、一次编写,随处运行。它可以运行在Windows,Mac OS X和几乎所有的Unix平台。 4、有经验的程序员很容易上手,因为语言就是这么简单,可以在几个小时或几天学习Tcl就可以搞定。 5、可以轻松地用Tcl扩展现有的应用程序。另外,也可以包括Tcl的用C,C++或Java 来扩展Tcl,或反之亦然。 6、有一组功能强大的网络功能。 7、最后,它的开源,免费的,可以用于其他无任何限制商业应用。 2基本语法 2.1命令结构 commandName空格arguments。每条命令之间通过换行或者;隔开。例如: #设置变量foo为0 set foo 0 set bar 1;puts $bar; #设置(set 为一个Tcl命令)变量bar为1,输出(puts也是一个Tcl命令)bar 2.2注释 使用#注释,不过要注意的是下面的注释是错误的: set foo 0 #设置变量foo为0,这种注释是错误的 因为tcl解析器总是认为一条命令应该以换行或者分号结束,其他的在同一行中都认为是参数。所以正确的应该是: set foo 0 #设置变量foo为0,这种注释是正确的 set foo 0; #设置变量foo为0,这种注释是正确的

tcl脚本进行二次开发

HyperMesh中利用Tcl脚本进行二次开发 杨国雄 上海世科嘉车辆技术有限公司

HyperMesh中利用Tcl脚本进行二次开发 Further Develop by Tcl Script Based on HyperMesh 杨国雄 (上海世科嘉车辆技术有限公司) 摘要:当代企业发展的关键是创新,本文通过对HyperMesh软件进来二次开发的两个实例—频响分析流程订制和通过Comps名自动定义单元属性,研讨了通过HyperMesh软件对企业CAE分析流程进行简化,标准化,人性化的可能性。 关键字:Tcl,二次开发,HyperMesh Abstract:Innovation is the key of contemporary enterprise's development. In this paper, 2 examples(customized frequency analysis process and automatic definition of element properties via comps name)were made by further developed of HyperMesh. The possibility of CAE analysis process be simplified, standardized and humanized with HyperMesh software was also discussed. Keyword:Tcl, Further Develop,HyperMesh 1 概述 随着各个行业对CAE技术应用的深入,企业对规范化分析流程,简化前处理等各个方面提出了需求。HyperMesh是一款功能强大的有限元前处理软件,同时还具有丰富的二次开发能力。通过二次开发为企业更好的利用HyperMesh软件提供了可能性。 2 HyperMesh二次开发简介 HyperMesh二次开发主要包括了2个层次的内容——宏命令和Tcl/Tk脚本。宏命令主要功能是定义面板按钮及对Tcl脚本的调用。Tcl/Tk脚本命令可以自定义各类窗口,程序的流程化控制,宏命令、Tcl脚本和C语言程序的关系如图1所示。本文主要讨论Tcl脚本的编写。

TCL语言.

TCL语言 Tcl(最早称为“工具命令语言”"Tool Command Language", 但是目前已经不是这个含义,不过我们仍然称呼它为TCL)是一种脚本语言。由John Ousterhout创建。TCL很好学,功能很强大。TCL经常被用于快速原型开发,脚本编程,GUI 和测试等方面。TCL念作“踢叩” "tickle". Tcl的特性包括: * 任何东西都是一条命令,包括语法结构(for, if等)。 * 任何事物都可以重新定义和重载。 * 所有的数据类型都可以看作字符串。 * 语法规则相当简单 * 提供事件驱动给Socket和文件。基于时间或者用户定义的事件也可以。 * 动态的域定义。 * 很容易用C, C++,或者Java扩展。 * 解释语言,代码能够动态的改变。 * 完全的Unicode支持。 * 平台无关。Win32, UNIX, Mac上都可以跑。 * 和Windows的GUI紧密集成。Tk * 代码紧凑,易于维护。 TCL本身不提供面向对象的支持。但是语言本身很容易扩展到支持面向对象。许多C语言扩展都提供面向对象能力,包括XOTcl, Incr Tcl 等。另外SNIT扩展本身就是用TCL写的。 使用最广泛的TCL扩展是TK。TK提供了各种OS平台下的图形用户界面GUI。连强大的Python语言都不单独提供自己的GUI,而是提供接口适配到TK上。另一个流行的扩展包是Expect. Expect提供了通过终端自动执行命令的能力,例如(pass wd, ftp, telnet等命令驱动的外壳). 下面是TCL程序的例子: #!/bin/sh # next line restarts using tclsh in path \ exec tclsh ${1+"$@"} # echo server that can handle multiple # simultaneous connections. proc newConnection { sock addr port } { # client connections will be handled in # line-buffered, non-blocking mode fconfigure $sock -blocking no -buffering line # call handleData when socket is readable fileevent $sock readable [ list handleData $sock ] } proc handleData {

Tcl脚本语言教程

Tcl教程 TCL语法 ■脚本、命令和单词符号 (2) ■置换(substitution) (2) ■注释 (5) 变量 ■简单变量 (5) ■数组 (6) ■相关命令 (6) 表达式 ■操作数 (7) ■运算符和优先级 (7) ■数学函数 (8) List ■list命令 (10) ■concat命令 (10) ■lindex命令 (11) ■llength命令 (11) ■linsert命令 (11) ■lreplace命令 (11) ■lrange 命令 (11) ■lappend命令 (12) ■lsearch 命令 (12) ■lsort命令 (13) ■split命令 (13) ■join命令 (13) 控制流 ■if命令 (13) ■循环命令:while 、for、foreach (14) ■eval命令 (15) ■source命令 (16) 过程(procedure) ■过程定义和返回值 (16) ■局部变量和全局变量 (17) ■缺省参数和可变个数参数 (17) ■引用:upvar (18) 字符串操作 ■format命令 (19) ■scan命令 (20) 1

■regexp命令 ■regsub命令 ■string命令 文件访问 ■文件名 ■基本文件输入输出命令 ■随机文件访问 ■当前工作目录 ■文件操作和获取文件信息 错误和异常 ■错误 ■从TCL脚本中产生错误 ■使用catch捕获错误 ■其他异常 深入TCL ■查询数组中的元素 ■info命令 TCL语法> 脚本、命令和单词符号 一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的: set a 1 set b 2 或 set a 1;set b 2 TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。 TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,TCL 解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。 TCL语法> 置换(substitution) 注:在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。'//'后面是我自己加上的说明,不是例子的一部分。 TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如: 2

tcl脚本

#无线节点参数 set val(chan) Channel/WirelessChannel ;#无线信道 set val(prop) Propagation/TwoRayGround ;#无线传输模型是TwoRayGround set val(netif) Phy/WirelessPhy ;#网络接口类型是无线物理层 set val(mac) Mac/802_11 ;#MAC层协议采用802.11 set val(ifq) Queue/DropTail/PriQueue ;#接口队列类型是IFQ队列 set val(ll) LL ;#逻辑链路层类型LL层 set val(ant) Antenna/OmniAntenna ;#天线类型是全向天线 set val(ifqlen) 50 ;#网络接口队列的大小是50 set val(rp) AODV ;#无线路由协议是AODV协议set val(x) 600 ;#设定拓扑范围——长度,600m set val(y) 200 ;#设定拓扑范围——宽度,200m set val(stop) 10.0 ;#设定模拟时间,10s set val(nn) 3 ;#节点数,3个 #建立一个模拟实例 set ns [new Simulator] #开启Trace跟踪文件和NAM显示文件 set tracefd [open wireless.tr w] set namtrace [open wireless.nam w] $ns trace-all $tracefd $ns namtrace-all-wireless $namtrace $val(x) $val(y) #建立一个拓扑对象,记录节点的移动情况 set topo [new Topography] $topo load_flatgrid $val(x) $val(y) #创建God(General Operations Diretor)对象,存储网络状态以及节点间连接信息 create-god $val(nn) #创建物理信道对象 set chan_1_ [new $val(chan)] #配置无线节点(包括使用何种路由协议,何种MAC协议,无线信道模型等) $ns node-config -adhocRouting $val(rp) \ -llType $val(ll) \ -macType $val(mac) \ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -channel $chan_1_ \

TCL脚本语言-14-输入输出系统

输入输出系统 输入和输出相比大家都不陌生。说起它,我就想起来大学第一次写Pascal程序的时候,总要写出这样的代码: Program Test(input,output); Begin Write(‘Hello,World!’); End. 老实说,第一行的input和output两个参数让我迷惑了很久,一直都不明白它们的用途。后来才慢慢的知道它们叫做输入和输出。 输入和输出总是和文件系统紧密相连。现代操作系统中,所有的设备几乎都被抽象成文件系统。但是不同操作系统下文件系统格式不同,例如Unix和Windows、MAC的目录等都有一定的差异。好在TCL语言比较好的解决了这个问题。本章节我们会详细的介绍如何在TCL中操作文件系统以及读写文件。 操作文件系统 TCL中能够非常方便的操作文件、目录。包括:查询和设置文件属性、复制、删除以及路径名字的操作等。所有这些都是通过一个file命令来完成,其语法都非常简单,所以我们这里只是按照分类,列举出该命令的各种用法: 文件属性操作 命令用法描述 file atime name ?time? 返回文件name最后被读取的时间;该命令在FAT文 件系统上无效(返回数据可能不正确); file mtime name ?time? 设置或者修改文件name的最后被修改时间。time参 数表示1970/1/1到现在的秒。设置最后修改时间,和 那个著名的touch命令完成类似的功能; file attributes name file attributes name ?opt? file attributes name ?opt vla? ?opt val?... 查询或者设置文件的属性。第一个命令查询所有的属性;第二个命令查询指定的属性;第三个设置属性的值。 file executable name 看看这个文件是否是可执行的,是就返回1;

TCL语言基础资料

TCL语言基础资料 一脚本语言详细介绍 21世纪的高级编程语言 摘要: Perl和Tcl等脚本语言代表一种与c或JavaTM 为代表的系统程序设计语言完全不同的编程形式。脚本语言为"胶着"应用程序而设计,它使用无类型方法来实现高级编程和比系统程序设计语言更快的发展应用。计算机速度的增长和混合应用的改变使脚本语言在今后的应用中越来越重要。 关键字: 组件框架,面向对象编程,脚本,强类型,系统编程 1.简介 在过去的十五年里,人们编写计算机程序的方法

发生了根本的转变。这种转变是从c或c++等系统程序设计语言到Perl或Tcl等脚本语言的过渡。虽然很多人参与了转变,却很少有人意识到它的发生,更不用说知道为什么会发生。这篇文章是我关于为什么在下个世纪脚本语言可以比系统程序设计语言更好的处理许多编程工作的一点看法。 与系统程序设计语言相比,不同的脚本语言为不同的工作而设计,这导致了语言间的根本不同。系统程序设计语言起源于像内存字等最初期的计算机元素,它为建立数据结构和算法而创建。相反的,脚本语言为胶着而设计:他们假设已经存在一套强大的组件,而它主要是把组件连在一起。系统程序设计语言使用强类型定义来帮助处理复杂事务,而脚本语言使用无类型定义来简化组件间的联系,并提供快速应用开发. 脚本语言和系统程序设计语言互为补充,并且二十世纪六十年代以来的大多数主要的计算机平台都同时提供这两种类型的语言。这些语言在组件框架中有着典型的应用:组件由系统程序设计语言创建,并由脚本语言组合在一起。然而,速度更快的机器,

更好的脚本语言,图形用户界面和组件构造重要性的不断提高,因特网的发展等发展趋势大大提高了脚本语言的应用。在今后的十年中,这种趋势将继续,而且越来越多的完全使用脚本语言和系统程序设计语言书写的应用程序将主要用来创建组件。 2.系统程序设计语言 为了理解脚本语言和系统程序设计语言的不同,最好先了解一下系统程序设计语言是如何发展的.系统程序设计语言是作为除汇编语言外的另一种选择而引入的.在汇编语言里,实际上机器的每一个细节都被反映在程序里.每个状态代表一个简单的机器指令,而程序员必须处理像寄存器分配和程序调用顺序等低层细节.因此,用汇编语言编写和维持大型程序是很困难的. 真的不掉线吗??、???????????? 二十世纪五十年代后期像Lisp,Fortran和Algol等高层语言开始出现.这些语言里的状态和机器指令不再完全一致,编译程序把过程程序中的每个状

TCL脚本-序言、工具安装

TCL、Python和软件测试自动化

Credits About Author

前言 当前,作为软件质量保证的一个有效过程,软件测试技术引起了越来越多人和公司的注意,并且获得了长足的进展。在这个领域里面各种思想、方法和工具层出不穷。并且与软件测试相关的咨询、测试工具也形成了一个较大的产业。在业界就有不少的公司提供了许许多多的软件测试工具,这些工具都提供了脚本,用户可以编写脚本来使测试工作自动化,它们的出现一定程度上提高了软件测试的效率。但是很多时候,这些工具并不能够完全满足我们的要求,更多的时候,我们需要开发自己的测试工具,编写自己的自动化测试脚本,来提高测试效率,特别是在针对嵌入式开发的领域。 脚本语言,是不需要编译就能够解释执行的语言。具有语言层次高,开发迅速,易于扩充,方便移植等特点,正是因为这些特点,在软件测试领域里面获得了广泛的应用。基本上现在商用工具都支持某种脚本语言: 表格0-1商业工具支持的脚本 工具名称厂家支持脚本 QARun WinRunner Robot SmartBits 自己实现测试工具,编写自动化脚本是一项非常具有挑战性的,但是非常有意义的工作。选择哪些脚本作为我们测试工具的脚本语言,是需要仔细考虑的事情。而TCL脚本作为软件测试领域里面最经典的语言,在业界已经获得了广泛的应用。并且TCL和其他语言相比,有如下几个重要特点: 1)简单易学。TCL脚本基于命令和替换的语法结构,对于有C/C++编程经验或者C Shell 编 程经验的而言,非常容易掌握。 2)功能强大,极易扩充。使用TCL脚本可以完成很多的事情,包括网络Socket编程、GUI 图形界面程序开发、数据库应用程序、实现简单的WebServer和FtpServer、实现COM自 动化服务器等。我们只需要极少量的TCL代码就能够完成需要数十倍C代码才能完成的功 能。并且该语言的扩展性非常好,你甚至可以扩充出你自己的语言控制结构!比如实现你 自己的switch结构。 3)面向对象的完美支持。TCL本身不支持面向对象,但是可以通过程序包的形式来扩展,并 且这些扩展包还非常多。不过最好用的就是ITcl。这个扩展包在TCL脚本上实现了对面向 对象编程的完美支持。 4)可以非常方便的嵌入其他应用程序。我们可以非常方便的将TCL解释器嵌入到我们自己的 应用程序中,使我们的程序具有通过脚本来被用户控制的功能。 5)可移植性良好。TCL发源于Unix,但是现在几乎在所有的操作系统上都实现了这个脚本解 释器,包括Windows和MAC。所以你写的TCL脚本基本上不用修改就能够在这些环境上 运行。

TCL脚本语言-4-数学计算,怎么这么烦

数学计算,怎么这么烦? 前面的快速入门教程里面已经提到了expr命令,TCL中所有的数学计算都是通过expr 命令来完成的。这一点和其他语言非常的不同,例如Python中: >>> from math import * >>> pi 3.1415926535897931 >>> print cos(pi/4)*2 , sqrt(2) 1.41421356237 1.41421356237 >>> Python里面的表达式是非常直观的,其他语言例如VBScript等也是如此。但是TCL中,即使是计算两个数字相加,都得使用expr命令: set a 100; set b 200 puts “a+b = $a+$b”;#输出a+b = 100+200 puts “a+b = [expr $a+$b]”;#输出a+b = 300 TCL中,expr加上一堆的$符号,方括号等字符,最简单的表达式,看起来都是非常不爽。这对于刚刚接触TCL的人来说,简直是一件无法忍受的事情,当初我也是这么认为的。后来在网上发现有人还真的通过扩展,在TCL实现类似Python的语法,比如原来的: set a [expr $a+$b] 可以写成: a = $a+$b 至于是怎么实现的,我们后面会进行详细的分析。但是我觉得,既然选择了TCL,就要习惯其用法;要么当初就选择Python拉到,所以我不赞成上面的这种改进。而且习惯了TCL 之后,也没有觉得它没有我们想象中的那么不方便。 语法描述 expr命令是TCL的核心命令之一,其语法格如下: expr arg ?arg arg ...? 该命令可以有一个或者多个参数,在执行的时候,把所有的参数连接起来成为一个数学

DDL,DML,DCL,TCL四种语言的简介

DDL,DML,DCL,TCL四种语言的简介 1.DDL(Data Definition Language)数据库定义语言 statements are used to define the database structure or schema. DDL是SQL语言的四大功能之一。 用于定义数据库的三级结构,包括外模式、概念模式、内模式及其相互之间的映像,定义数据的完整性、安全控制等约束 DDL不需要commit. CREATE ALTER DROP TRUNCATE COMMENT RENAME 2.DML(Data Manipulation Language)数据操纵语言 statements are used for managing data within schema objects. 由DBMS提供,用于让用户或程序员使用,实现对数据库中数据的操作。 DML分成交互型DML和嵌入型DML两类。 依据语言的级别,DML又可分成过程性DML和非过程性DML两种。 需要commit. SELECT INSERT UPDATE DELETE MERGE CALL EXPLAIN PLAN LOCK TABLE 3.DCL(Data Control Language)数据库控制语言授权,角色控制等GRANT 授权 REVOKE 取消授权 4.TCL(Transaction Control Language)事务控制语言 SAVEPOINT 设置保存点 ROLLBACK 回滚 SET TRANSACTION SQL主要分成四部分: (1)数据定义。(SQL DDL)用于定义SQL模式、基本表、视图和索引的创建和撤消操作。 (2)数据操纵。(SQL DML)数据操纵分成数据查询和数据更新两类。数据更新又分成插入、删除、和修改三种操作。

Tcl用法详述

T C L用法祥述 一TCL语法 1 脚本、命令和单词符号 一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的: set a 1 set b 2 或 set a 1;set b 2 TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。 TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,TCL 解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。 2 置换(substitution) 注:在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。'//'后面是我自己加上的说明,不是例子的一部分。 TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如: %set x 10 //定义变量x,并把x的值赋为10 10 %set y x+100 //y的值是x+100,而不是我们期望的110 x+100 上例的第二个命令中,x被看作字符串x+100的一部分,如果我们想使用x的值'10' ,就必须告诉TCL解释器:我们在这里期望的是变量x的值,而非字符'x'。怎么告诉TCL解释器呢,这就要用到TCL语言中提供的置换功能。 TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。 1) 变量置换(variable subtitution)

TCL脚本语言-7-正则表达式

正则表达式 首先要说的是,正则表达式本身就能够写成一本书,而且这样的书已经存在了。正则表达式是一种匹配模式,用来匹配部分特定的字符串。正则表达式在脚本语言中使用非常广泛,对于TCL脚本有其如此,因为TCL中一切都是字符串,而正则表达式是处理字符串的利器。TCL中处理正则表达式的命令有两个: regexp ?switches? exp string ?matchVar? ?subMatchV ar subMatchVar ...? regsub ?switches? exp string subSpec ?varName? regexp用来对字符串进行正则表达式的查找匹配;regsub则是对字符串进行正则表达式的查找和替换操作。下面是两个例子: % regexp -inline {0x[a-zA-Z0-9]+} "int a = 0x22FF;" 0x22FF % regsub -all {(.+)=(.+)} "a=100" {\2=\1} 100=a % 第一个例子,找出其中所有的十六进制数值;第二个,找出等号字符前后的串,并且前后互换。可以看到,这里最重要的就是正则表达式的语法。下面我们结合例子一一讲述。 正则表达式语法 正则表达式有着严格的语法规则,总结如下三条: 1.正则表达式是用管道线符号“|”连接的一个或者多个分支(branch)组成;只要字 符串能够匹配上其中任意一个分支,就算匹配整个表达式; 2.每一个分支是由零个或多个约束(constraints)或者量化修饰的原子(atom)顺序 连接而成; 3.每一个原子包含了一个基本原子,后面跟着0个或者多个数量修饰串;如果没有数 量修饰,那么就表示匹配一个原子; 数量限定 数量限定符号跟在原子后面,表示匹配前面的原子重复次数。可以有如下几种: 1.*:表示匹配前面零个或者多个原子,等价于{0,}; 2.+:表示匹配前面的一个或者多个原子,等价于{1,}; 3.?:表示匹配前面的零个或者一个原子,等价于{0,1};

TCL培训教程(全)

. Tcl编程简介(一) 简介 Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。是tool command language的缩写,发音为 "tickle”,实际上包含了两个部分:一个语言和一个库。 首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。 其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。 下面简单介绍以下tcl的语法规则: 解释器 在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。每一个 Tcl命令是在特定的 Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Interp。 Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。 数据类型 Tcl只支持一种数据结构:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点,所有的东西都是字符串。这是它比较有特点的方面字符串有三种形式:命令(command), 表达式(expresion)和表(list)。 Basic Command Syntax 基本语法 Tcl有类似于shell和lisp的语法,当然也有许多的不同。一条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是一个命令的名字,其它

Tcl脚本编程测试题

Tcl/Tk Quiz Sheet Time: 2 hours Part I. Fill Out. (10%) Tcl is for __________________________________, it’s a ___________ language. 生成pkg_Index.tcl文件的命令是________________________。 在执行package require命令的时候,该命令会根据变量_________查找相关package所在路径。 Tcl命令出错时错误信息一般存放在全局变量___________中。 用命令_____________________可以列出数组中元素名称。 可将一个字符串中的每个字符分开来的list命令是______;如果字符串是“HappyDay”,则完整的命令为______________________。如果要在这个字符串中每个字符之间插入一个“/”,则可以使用上面的命令和另一个list命令______来共同完成,完整命令为____________________________________________________________________________。 名字空间输出过程/函数的命令是namespace _________________。而从名字空间输入过程的命令则是_____________________。 在读取文件时,判断已到文件结尾的命令是_____________。 获取过程的脚本的命令是info______;而获取过程的参数的命令是____________。判断一个变量是否存在的命令是__________。 可以用来装载并执行脚本文件的Tcl命令是____________。 环境变量被存放在一个特殊数组中,即________________。 根据模式说明来格式化字符串的命令是________________,而根据模式来解析字符串的命令是_______________。 Part II. Choice correct answer(s) for the following review questions .(24%) To open a file for reading and writing, which command is right? [ ] (1%) open $file rw open $file r+ open $file w open $file w+ In which sentence(s) the variable after (first) “$” can be replaced by it’s actual value? * + (3%) catch { puts {My name is $name} } err regexp {my name is $name- “I’m a girl, my name is QQ” match set str {My name is $name} eval ,puts “My name is $name”- set var name; puts “My name is $$var” if ,$name >= “QQ”- ,puts “$name is bigger than QQ”- subst {a={{$name}},b=[expr 3*10]} switch $X , “$name” ,puts ok- …- To find out commands which can be used to destroy an array “arrParams”.* + unset arrParams array unset arrParams destroy arrParams forget arrParams

相关主题
相关文档
最新文档