TCL脚本数据文件格式
tcl脚本语言介绍
中的方括号部分,产生一条新命令
set a "hello" //"hello" 为 set b "hello" 的返
//回值
最终的结果是b="hello" a="hello"
当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分都被视为Tcl命令。
Variables: scalars and arrays 变量:标量和向量(即数组)
向量就是数组,而标量是没有下表的变量。
我们用C来类比:
int i; // i 是标量
int j[10]; // j 是向量
变量不需要定义,使用的时候会自动的被创建。Tcl支持两种
变量:标量和向量
举个例子来说明吧,
Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对 Tcl有很好的描述和说明。如果你看起来很吃力,那是因为 Tcl与一般的语言有一些不同之处,刚开始可能有一些不理解,但很快就会掌握的。请坚持一下,我能坚持写完,你至少也应该坚持读一遍吧!
这里有一个初学者不注意的地方,上述的定义一定要写成那样子。而不能向下面那样写:
proc pf {str}
{
puts $str
}
因为proc实际上也只不过是一条命令,是一换行符或分号来结束的,用集群参数来传递函数体。proc的定义如下:
proc name args tclcommand
tcl脚本语言(上)
语法
双引号和花括号
TCL解释器对双引号中的各种分隔符将不作处理,但是对 换行符及$和[]两种置换符会照常处理。 在花括号中,所有特殊字符都将成为普通字符,失去其特 殊意义,TCL解释器不会对其作特殊处理。
语法
注释
TCL中的注释符是‘#’,‘#’和直到所在行 结尾的 所有字符都被TCL看作注释,TCL解释器对注释将不 作任何处理。不过,要注意的是,‘#’必须出现在 TCL 解释器期望命令的第一个字符出现的地方,才被当作 注释。
LIST
linsert命令
语法:linsert list index value ?value...? 功能:返回一个新串,新串是把所有的value参 数值插入list的第index个(0-based)元素 之前得到。 实例:% linsert {1 2 {3 4}} 1 7 8 {9 10} 1 7 8 {9 10} 2 {3 4}
变量
简单变量
一个TCL的简单变量包含两个部分:名字和值。名字和值都可以是任意 字符串。不过为了更好的使用置换,变量名最好按C\C++语言中标识符的命 名规则命名。 TCL解释器在分析一个变量置换时,只把从$符号往后直到 第一个不是字母、数字或下划线的字符之间的单词符号作为要被置换的变 量的名字 。
LIST
split命令 语法:split string ?splitChars ? 功能:把字符串string按分隔符splitChars(string中也用这个分割)分成一 个个单词,返回由这些单词组成的串。如果splitChars是一个空字符 {},string被按字符分开。如果splitChars没有给出,string原样输出。 实例:% split “how.are.you" . how are you % split "how are you" how are you % split "how are you" {} how{}are{}you
tcl脚本教程
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"
infoexistsvarnamesetvarnamesomevarjoin和splitsplitsomestring把一个字符串解成listsplitsomestring以为分隔符把一个字符串解成listjoinsomelist把一个list合成一个字符串joinsomelist以为分隔符把一个list合成一个字符串语法要点续list及相关操作listarg1argn把各个参数合成一个listllengthsomelist返回list的长度元素个数lindexsomelist返回list的第一个元素lindexsomelistend返回list的最后一个元素end是list操作的保留字lindexsomelistexprllengthsomelist什么意思
gets channelId ?varName? gets 从一个channel取一个行到指定变量;同时它本身也返回这个行, 所以gets还有第二种用法:
gets stdin Name
变量
• 变量是程序的基础。 • 变量:变量名、变量值 • 变量名:任何字符串都可作为变量名,如下所示,皆可作变量名
% puts $Name
% set x puts
tcl脚本语言中文详解
T C L用法祥述一TCL语法1 脚本、命令和单词符号一个TCL脚本可以包含一个或多个命令。
命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的:set a 1set b 2或set a 1;set b 2TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。
TCL解释器对一个命令的求值过程分为两部分:分析和执行。
在分析阶段,TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,TCL 解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。
2 置换(substitution)注:在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。
'//'后面是我自己加上的说明,不是例子的一部分。
TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如:%set x 10 //定义变量x,并把x的值赋为1010%set y x+100 //y的值是x+100,而不是我们期望的110x+100上例的第二个命令中,x被看作字符串x+100的一部分,如果我们想使用x的值'10' ,就必须告诉TCL解释器:我们在这里期望的是变量x的值,而非字符'x'。
怎么告诉TCL解释器呢,这就要用到TCL语言中提供的置换功能。
TCL提供三种形式的置换:变量置换、命令置换和反斜杠置换。
每种置换都会导致一个或多个单词本身被其他的值所代替。
置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。
1) 变量置换(variable subtitution)变量置换由一个$符号标记,变量置换会导致变量的值插入一个单词中。
TCL脚本技术及用法
TCL内建命令
TCL还提供三种特殊的参数形式: 首先,你可以定义一个没有参数的过程。 % proc add {} { expr 2+3} 其次,可以定义具有缺省参数值的过程。 % proc add {val1 {val2 2} {val3 3}} { % expr $val1+$val2+$val3 %} 另外,TCL的过程定义还支持可变个数的参数,如果 过程的最后一个参数是args, 那么就表示这个过程支持 可变个数的参数调用。
引言
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解释器当作特殊符号 对待的字符。置换可以嵌套。
Spirent Testcenter 自动化测试脚本 TCL(1)
Spirent Testcenter自动化测试脚本TCL -1基本功能2015-06-18 浏览(69) #!/bin/sh# aTemplate.tclexec tclsh "$0" ${1+"$@"}#-----------------------------------------------------###-----------------------------------------------------#引用STC API ,SpirentTestCenter.tcl的路径source {C:ProgramFilesSpirentCommunicationsSpirentTestCenter4.20Spirent TestCenterApplicationSpirentTestCenter.tcl}#开启日志,-logTo:日志保存路径,使用stdout为标准输出; -loglevel:可选DEBUG、INFO 、WARN 和ERROR 四种;stc::configautomationoptions -logTo "aTemplateLog.txt" -logLevel DEBUG #配置机框Ip槽位端口号set chassisAddress "192.168.0.100"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)set StreamBlock(1) [stc::create "StreamBlock"-under $TxPort-frameConfig ""-FrameLengthMode "FIXED"-FixedFrameLength "222"-name "StreamBlock_1"]#在StreamBlock(1)中添加EthII头set StrEthII [stc::create ethernet:EthernetII -under $StreamBlock(1) -name eht_1 -srcMac 11:11:11:11:11:11 -dstMac 22:22:22:22:22:22 ]#添加IPv4头set strIPv4 [stc::create ipv4:IPv4 -under $StreamBlock(1) -name Ipv4_1 -sourceAddr 10.10.10.10 -destAddr 20.20.20.20]#添加TCP头set strTcp [stc::create tcp:Tcp -under $StreamBlock(1) -name tcp1-sourcePort 10 -destPort 20 ]#创建Streamblock2set StreamBlock(2) [stc::create "StreamBlock"-under $TxPort-frameConfig ""-FrameLengthMode "FIXED"-FixedFrameLength "222"-name "StreamBlock_2"]set StrEthII [stc::create ethernet:EthernetII -under $StreamBlock(2) -name eht_2 -srcMac 31:11:11:11:11:11 -dstMac 42:22:22:22:22:22 ]#添加IPv4头set strIPv4 [stc::create ipv4:IPv4 -under $StreamBlock(2) -name Ipv4_2-sourceAddr 40.40.40.40 -destAddr 50.50.50.50]#添加TCP头set strTcp [stc::create udp:Udp -under $StreamBlock(2) -name tcp_2-sourcePort 40 -destPort 50 ]#配置StreamBlock(1)的modifier 可以选择RangeModifer、RandomModifier、TableModifier#StreamBlock1 源Ip随机set RandomModifier1 [stc::create RandomModifier -under $StreamBlock(1) -Mask {0.0.0.255} -RecycleCount 10 -Offset 0 -EnableStream FALSE-OffsetReference {Ipv4_1.sourceAddr} ]#StreamBlock2 目的Ip递增set RangeModifier2 [stc::create RangeModifier -under $StreamBlock(2)-ModifierMode INCR -Mask {0.0.255.0} -StepValue {0.0.1.0}-RecycleCount 10 -RepeatCount 0 -Data {0.0.50.0} -EnableStream FALSE -Offset 0 -OffsetReference {Ipv4_2.destAddr} -Active true]#在发送端口创建generatorset generator1 [stc::get $TxPort -children-Generator ]stc::config $generator1 -Name "Generator_1"#配置generator1 ,set generatorConfig1 [stc::get $generator1 -children-GeneratorConfig ]#-------------------------------配置说明--------------------------------------------#SchedulingModes属性,可选参数:PORT_BASED 、RATE_BASED 、PRIORITY_BASED 、MANUAL_BASED#DurationMode属性,可选参数:CONTINUOUS 、BURSTS 、SECONDS 等,#LoadUnit属性,可选参数:PERCENT_LINE_RATE 、FRAMES_PER_SECOND 、BITS_PER_SECOND 、# KILOBITS_PER_SECOND 、MEGABITS_PER_SECOND 、INTER_BURST_GAP#--------------------------------------------------------------------------------- stc::config $generatorConfig1 -SchedulingMode "PORT_BASED"-DurationMode "BURSTS"-BurstSize 1-Duration 20#在接收端口创建analyzerset analyzer1 [stc::get $RxPort -children-Analyzer]#配置analyzerstc::config $analyzer1 -Name "Analyzer 1"set analyzerConfig1 [stc::get $analyzer1 -children-AnalyzerConfig]#-------------------------------配置说明-------------------------------------------- #TimestampLatchMode属性,可选参数:START_OF_FRAME 、END_OF_FRAME##--------------------------------------------------------------------------------- stc::config $analyzerConfig1 -TimestampLatchMode "END_OF_FRAME" -JumboFrameThreshold "1500" -OversizeFrameThreshold "2000"-UndersizeFrameThreshold "64" -AdvSeqCheckerLateThreshold "1000" -Name "AnalyzerConfig_1"#配置实时结果获取#结果保存在与脚本相同路径下,结果文件名为resultset generatorResult [ stc::subscribe -Parent $ProjectA-ResultParent $TxPort-ConfigType Generator-resulttypeGeneratorPortResults-filenameprefix "result"]set analyzerResult [ stc::subscribe -Parent $ProjectA-ResultParent $RxPort-ConfigType Analyzer-resulttypeAnalyzerPortResults-filenameprefix "result" ]#连接机框set resultReturn [ stc::connect $chassisAddress]#占用端口set resultReturn [ stc::reserve "//$chassisAddress/$slotPort1"]set resultReturn [ stc::reserve "//$chassisAddress/$slotPort2"]#配置抓包端口set captureRx [stc::get $RxPort -children-capture]set captureTx [stc::get $TxPort -children-capture]#-----------------------------------配置说明-------------------------------------#mode 属性,可选参数:REGULAR_MODE,抓所有报文;SIG_MODE:抓有signature的报文。
TCL脚本语言-14-输入输出系统
file split name
和 file join 恰好相反,将路径 name 拆分层各个独立的
目录单元;
file tail name
返回路径 name 中剔除目录名后的最后文件名
请看下面的例子:
% file dirname {d:\tmp\a.txt}
->d:/tmp
% file extension {d:\tmp\a.txt}
perf_test.tcl pkgIfNeeded.tcl test_func.tcl 返回一个列表,三个元素都是搜索到文件名,如果我们下发如下的命令:
glob –directory –types f *.tcl
作者:雷雨后
Email: leiyuhou010@
TCL、Python 和软件测试自动化
v(atime) = 1116764165 v(ctime) = 1116761242 v(dev) = 3 v(gid) = 0 v(ino) = 0 v(mode) = 33188 v(mtime) = 1116545258 v(nlink) = 1 v(size) = 442 v(type) = file v(uid) = 0 % file system $fp
-archive = 1 -hidden = 0 -longname = D:/tmp/aa.txt -readonly = 0 -shortname = D:/tmp/aa.txt -system = 0 % file attributes $fp –shortname #查询短文件名 D:/tmp/aa.txt % file attributes $fp –readonly 1 #让文件具有只读
file stat name varname
Vivado之TCL脚本语言基本语法介绍
Vivado之TCL脚本语言基本语法介绍
TCL脚本语言
Tcl(Tool Command Language)是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,而且VIV ADO也提供了TCL命令行。
最近发现TCL脚本貌似比GUI下操作VIV ADO效率高一些,方便一些。
而且最近跟着官网文档做SDSOC的flatform,发现xilinx 官网的文档里都是用TCL命令来完成操作,于是决心学习一下TCL的语法。
应用程序(如VIV ADO)使用Tcl作为它的命令语言的好处:
1 Tcl提供了标准语法,一旦用户掌握了Tcl就可以很容易的发布命令给基于Tcl的程序。
2 Tcl实现了很多的功能,使你的工作变得很方便。
3 TCl可作为程序间通信的接口。
命令格式
一条Tcl的命令串包含了多条命令时,用换行符或分号来隔开
而每一条命令包含了一个域的集合,域使用空白分开的,第一个域是一个命令的名字,其它的是作为参数来传给它
数据类型
Tcl只支持一种数据结构:字符串。
所有的命令、命令里的所有的参数、命令的结果、变量全部都是都是字符串。
简单实例:
set i 123
将123这个字符串赋值给i变量
unset i
清除变量
set i hi
将hi这个字符串赋值给i变量
set i hi hello
hi hello中有空格,所以加引号。
tcl教程
tcl教程TCL(工具命令语言)是一种脚本语言,主要用于实现自动化工作流程、快速开发小型工具和控制系统等应用。
它具有简单易学、功能丰富以及可移植性好等特点。
本教程将带你从基础开始逐步学习TCL的语法和常用命令,并通过实例演示帮助你快速掌握TCL编程。
1. TCL的安装和运行环境配置首先,你需要下载并安装TCL的最新版本。
在安装过程中,请根据操作系统选择正确的安装文件,并按照向导进行安装。
安装完成后,你可以在命令行界面中输入"tclsh"来启动TCL解释器,并进入TCL编程环境。
2. TCL脚本的基本结构和语法一个TCL脚本通常由一系列的命令组成,每条命令占据一行。
TCL命令以"$"符号开头,如"$command argument1 argument2"。
TCL的注释以"#"符号开头,后面的内容将被忽略。
以下是一个简单的TCL脚本示例:```tcl#!/usr/bin/tclsh# 输出Hello World!puts "Hello World!"```3. 变量和数据类型TCL支持多种数据类型,包括整数、浮点数、字符串、列表和字典等。
你可以使用"set"命令定义一个变量,并使用"$"符号在其他地方引用该变量。
以下是一些例子:```tclset name "Tom"set age 18set pi 3.14159set fruits {apple banana orange}set person(name) "John"```4. 控制流结构TCL提供了常见的控制流结构,如条件语句和循环语句,用于控制程序的执行流程。
以下是一些控制流语句的示例:if语句:```tclif {$age >= 18} {puts "成年人"} else {puts "未成年人"}```while循环语句:```tclset num 1while {$num <= 10} {puts $numincr num}```5. 文件操作TCL提供了一组用于文件操作的命令,如打开文件、读取文件、写入文件和关闭文件等。
【tcl脚本】改变输出字符格式
登录后才能查看或发表评论立即登录或者逛逛博客园首页
【 tcl脚本】改变输出字符格式
需求:
原list输出格式
0x00 0x50 0x01 0x03 0x04 0x02 0x21 0x57 0x01 0x00 0x05 0x0B 0x03 0x13 0x00 0x01
要求list输出格式为
list21 is : 04030150 list22 is : 01572102 list23 is : 030b0500 list24 is : 00010013 list20 is : 04030150 01572102 030b0500 00010013
思路
1. 去除0x方式显示;
2. 四字节连成一个string,string再转化成list;
3.不够四字节前面补零。
代码
#!/usr/bin/env tclsh set mReply {0x00 0x50 0x01 0x03 0x04 0x02 0x21 0x57 0x01 0x00 0x05 0x0B 0x03 0x13 0x00 0x01} set len [llength $mReply]
for {set i 1} {$i<=[expr $len-1]} {incr i} { set mቤተ መጻሕፍቲ ባይዱit [format "%02x" [lindex $mReply $i]] set mReply [lreplace $mReply $i $i $mBit] }
6.1.2Tcl脚本[共4页]
6.1.2Tcl脚本[共4页]命令行与Tcl 脚本2496.1.2 Tcl 脚本一、 T cl 解释器Tcl 是EDA 业界标准脚本语言,被Synopsys 、Mentor Graphics 和Synplicity 等EDA 业界领先公司所采用。
在Tcl 语言中,允许用户定义自己的命令,并可以在多数的设计平台间无缝转换。
在前面提到的Quartus II 的命令行中,quartus_sh 、quartus_tan 、quartus_cdb 和quartus_sim 命令同时也是Tcl 的解释器,一些T cl 命令可以分别在这4个T cl 解释器中执行。
二、 T cl 命令包由于整个Quartus II 支持的T cl 命令的数量非常庞大,工具把其所提供的Tcl 命令按照类似的功能块分为若干个T cl 包,每个包中有不同分类的Tcl 命令。
例如,“project ”包内部的命令主要是用来设置和得到工程中的约束的,“device ”包主要是用来得到器件信息的。
如图6-5所示,“project ”T cl 包中就包含“project_new ”和“set_global_assignment ”等命令,用来完成新建工程,增加约束等工作。
图6-5 project 包中的Tcl 命令Quartus II 工具支持的所有T cl 包如下。
::quartus::project :用来建立工程,增加工程设置。
::quartus::device :器件信息。
::quartus::advanced_device :高级器件信息。
::quartus::flow :简单编译流程。
::quartus::timing :计算并报告时序路径。
系统学习TCL脚本入门教程解析
系统学习TCL脚本入门教程版本:1. 0作者:次目录1TCL语法 (4)1.1 简介 (4)1.2 运行环境 (4)1.3 本文约定 (4)1.4 参考资料 (4)2引言 (5)2.1 第1课:简单文本输出 (5)2.2 第2课:给变量赋值 (5)2.3 第3课:命令的赋值与置换一 (6)2.4 第4课:命令的赋值与置换二 (7)2.5 第5课:命令的赋值与置换三 (7)2.6 第6课:算数运算 (8)2.7 第7课:文本比较-SWITCH应用 (9)2.8 第8课:数值比较-IF应用 (10)2.9 第9课:WHILE循环 (11)2.10 第10课:FOR循环和INCR (11)2.11 第11课:过程PROC (12)2.12 第12课:过程PROC的参数定义 (13)2.13 第13课:变量的作用域 (13)2.14 第14课:LIST结构 (14)2.15 第15课:LIST项的增删改 (15)2.16 第16课:更多LIST相关 (16)2.17 第17课:字符串函数 (17)2.18 第18课:更多字符串函数 (17)2.19 第19课:修改字符串函数 (20)2.20 第20课:正则表达式 (21)2.21 第21课:更多正则表达式 (22)2.22 第22课:数组 (24)2.23 第23课:更多数组相关 (25)2.24 第24课:文件存取 (28)2.25 第25课:文件信息 (30)2.26 第26课:TCL中的子进程调用-OPEN & EXEC (33)2.27 第27课:命令或者变量是否存在-INFO (34)2.28 第28课:解释器状态-INFO (35)2.29 第29课:过程信息-INFO (36)2.30 第30课:模块化-SOURCE (37)2.31 第31课:建库-UNKNOWN & INFO LIBRARY (38)2.32 第32课:创建命令-EV AL (40)2.33 第33课:在EV AL中应用FORMAT & LIST (40)2.34 第34课:不使用EV AL替换-FORMAT & SUBST (42)2.35 第35课:改变工作目录-CD & PWD (43)2.36 第36课:调试和错误-ERRORINFO & ERROR C ODE & CATCH (44)2.37 第37课:调试-TRACE (45)2.38 第38课:命令行参数和环境串 (46)2.39 第39课:TIME & UNSET (47)2.40 第40课:SOCKET & FILEEVENT & VWAIT (49)2.41 第41课:日期时间-CLOCK (51)2.42 第42课:I/O通道-FBLOCKED & FCONFIG (53)2.43 第43课:子解释器 (56)2.44 第44课:数据库操作 (57)2.45 第45课:函数或过程数组的输入和输出方法 (59)2.46 第46课:INFO的用法 (60)2.47 第47课:多线程 (61)3跋 (75)1TCL语法1.1简介作为脚本语言,tcl语法简单而功能强大。
TCL脚本语言1-32
7
return $result }
#使用 while 循环来实现阶乘 proc Factorial2 {n} {
set result 1 set i 1 while {$i<=$n} {
set result [expr $result*$i] incr i } return $result }
puts "10! = [Factorial1 10]" puts "5! = [Factorial2 5]"
% set PI 3.1415926535897932 3.1415926535897932 % expr "cos($PI/4)*2" 1.41421356237 % expr "sqrt(2)" 1.41421356237
;#创建变量 PI ;#计算得到 sqrt(2) ;#直接计算得到 sqrt(2)
% set sum $r+$i 100+200 % set sum [expr $r+$i] 300 %
;#企图计算 r 和 i 两个变量的和,但是事与愿违; ;#只有这样才行
看看上面的例子就明白了,第一种方法计算 sum,结果 sum 的值是字符串“100+200”。 只有通过第二种方式,使用 expr 命令来计算表达式$r+$i,sum 的值才是我们期望的 300。在 TCL 中,所有的数学计算都是通过 expr 命令来实现的。例如通过计算正弦来得到 2 的平方 根:
;#输出所有的下标
可以看到,TCL 中的数组和我们 C 语言中熟悉的数组完全不是一回事,倒是和 VBScript 中的对象 Dictionary 非常的类似。TCL 中没有多维数组的概念,但是后面我们会讲到如何使 用多维数组。
tcl puts进阶用法
tcl puts进阶用法"Tcl puts"命令用于在Tcl脚本中打印输出文本。
下面是一些"puts"命令的进阶用法:1. 输出到标准输出:```puts "Hello, World!"```2. 输出到标准错误:```puts stderr "This is an error message."```3. 格式化输出:"puts"命令支持使用格式字符串进行输出,类似于C语言的printf。
可以使用格式化标记(如%s、%d、%f等)来指定输出的数据类型:```set name "John"set age 25puts "My name is $name and I am $age years old."```4. 输出到文件:"puts"命令还可以将输出写入到文件中。
使用"open"命令打开一个文件,然后使用"puts"命令将内容写入文件。
写入完成后,使用"close"命令关闭文件: ```set fileHandle [open "output.txt" "w"]puts $fileHandle "This is a line of text."close $fileHandle```5. 刷新输出缓冲:默认情况下,Tcl在每行输出后会自动刷新输出缓冲。
但是,有时需要手动刷新输出缓冲。
可以使用"flush"命令来立即刷新输出缓冲: ```puts "This line will be flushed immediately."flush stdout```这些是"puts"命令的一些进阶用法。
tcl项目中pkg_mkindex用法
tcl项目中pkg_mkindex用法在Tcl(Tool Command Language)中,`pkg_mkindex` 是一个用于生成`pkgIndex.tcl` 文件的实用程序,它通常用于创建包索引文件,以便在加载Tcl包时能够正确识别和访问其中的模块、命令或其他资源。
`pkg_mkindex` 实用程序的使用方法如下:pkg_mkindex directory ?pattern? ?pattern? ...其中:- `directory` 是包含Tcl脚本文件的目录路径。
- `pattern` 是一个可选的模式,用于匹配要包含在`pkgIndex.tcl` 中的文件。
如果未提供模式,则`pkg_mkindex` 将扫描目录中的所有文件。
`pkg_mkindex` 命令会检查指定目录中的Tcl脚本文件,并根据提供的模式((如果有)创建`pkgIndex.tcl` 文件。
此文件包含了Tcl脚本文件的信息,通常以`package` 命令的形式列出,以便其他Tcl程序可以通过`package require` 命令加载特定的Tcl包。
以下是一个简单的示例,展示了如何使用`pkg_mkindex` 命令:假设我们有一个名为`my_package` 的文件夹,其中包含了一些Tcl脚本文件,比如`script1.tcl`、`script2.tcl` 和`script3.tcl`。
我们想要创建一个`pkgIndex.tcl` 文件,其中包含这些脚本文件。
# 执行pkg_mkindex 命令来创建pkgIndex.tcl 文件pkg_mkindex my_package *.tcl这个命令会在`my_package` 目录中查找所有以`.tcl` 结尾的文件,并将它们的信息写入`pkgIndex.tcl` 文件,这样其他Tcl程序就可以通过`package require` 来加载这些脚本文件了。
请注意,`pkg_mkindex` 命令对于管理和组织Tcl脚本文件并提供包索引非常有用,特别是在编写和使用Tcl包时。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
# Ignore blank lines
} else {
puts "error: unknown keyword."
}
}
close $fid
.c create rectangle $x1 $y1 $x2 $y2 -width $thickness -outline $color
}
proc d_text {x y text anchor color} {
.c create text $x $y -text $text -anchor $anchor -fill $color
当你读取这种格式的文件时,或许得先对文件进行分析然后据此创建数据结构.分析文件时,你要一行一行地尝试,使用象regexp这类的工具来分析文本不同的部分.下面是一个可能的过程:
example1/parser.tcl
canvas .c
pack .c
我们无需再做任何分析,不用正则表达式,不用一行一行地循环,不用打开/关闭文件.只需调用source命令就完成了所有的工作。
数据文件已经成了可以执行的TCL脚本.因为它包含的是可执行命令,而不仅仅是被动的数据,所以称之为主动文件.主动文件在大多数脚本语言环境中均可正常运行,在Nat
我们一次读取一行数据,使用正则表达式查找该行代表的是某种数据类型.通过检查第一个词,我们可以区分代表长方形的数据和代表文本的数据,所以第一个词是一个关键字,它明确地告诉我们正在处理的是什么类型的数据.同样我们分析每个项目的坐标,颜色和其他属性.括号中正则表达式的分组部分使我们找到变量'x1','x2'等的分析后的结果.
我的英文水平一般,况且TCL语言对我是个新事物,尽管现在有了一定的了解,但其中的一些术语,我还是理解的不够透彻.所有译文中的有些地方可能让大家觉得有些迷惑,甚至可能有些可笑,对此还请各位谅解.也希望有高手能指出译文中的错误,别让我的劣作影响了各位网友的学习.
同时也真诚希望大家给我来信,交朋友,共同提高.
}
现在要在画布上绘图,我们调用这两个过程就行了,每次调用其中的一项。比如要画如前所述的图形,需要下面三个调用。
example2/datafile.dat
d_rect 10 10 150 50 2 blue
d_rect 7 7 153 53 2 blue
我的email:zkzxl@
不知我的译文出来前,是否已经有网友为各位译出来,希望能够互相交流一下.
*******ቤተ መጻሕፍቲ ባይዱ************************************************************************
*,它们执行后会带来严重的后果.解决这个问题的办法是在安全模式下执行主动文件,防止危险命令。具体信息可参看TCL手册中"安全解释器"部分.
▲主动文件样本的局限
此样本不是对所有可能的数据格式都有效.数据格式必须是以行为基础的,每一行必须以一个关键字开头.用关键字开头写TCL过程,就把被动的关键字变成了主动的命令。这也意味着你不能使用象if或while之类的关键字,因为TCL不允许你用这样的名字来写过程.事实上,上面的例子中我把关键字改为d_text,就是因为开发工具包已经有了保留字text,该命令用来创建文本工具.
{^rectangle +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +([0-9]+) +(.*)$} \
$line dummy x1 y1 x2 y2 thickness color] } {
.c create rectangle $x1 $y1 $x2 $y2 -width $thickness -outline $color
假如你知道正则表达式如何工作,这看上去是一个很简单的实现.但我觉得它有点难以维护,正则表达式也使其难以理解.
还有一个更简捷的解决方法,叫做“active file(主动文件)”.原本由Nat
Pryce在设计样本时想到的。这种方法基于一个非常简单的提议:与其用TCL自己来写语法分析器(用regexp或其他途径),干嘛不让TCL的语法分析器为你做这些工作呢?
▲主动文件设计样本
为解释这种设计样本,我们继续使用上节中那个简单的绘图工具。首先我们用TCL语言写两个过程,一个画矩形,一个写文本。
example2/parser.tcl
canvas .c
pack .c
proc d_rect {x1 y1 x2 y2 thickness color} {
Pryce的主页上对其有详细的描述.
▲使用主动文件样本的优点:
无需再写一个分析程序,source调用TCL分析程序即可完成.
容易读取数据文件格式.
使用主动文件样本的缺点:
如果数据文件包含有危险命令,象l -a exec rm
horizontally stretched rectangles with a line thickness of 3. The final
line places a piece of red text, anchored at the center (hence the "c"),
TCL脚本数据文件格式
TCL脚本数据文件格式
写在前面的话
在论坛上看到这篇文章时,一时冲动,发出一个贴子:Let me
try.等真正大致看了一下原文后,才有些后悔,倒不是怕工作量太大,只是担心以自己的英文水平能否把这个文章按照作者的意思表达清楚.不怕各位笑话,在此之前,我对TCL几乎是没有听说过(只知道TCL----王牌),更不用说掌握了.没有办法,只能现学现卖,在网上找到相关的介绍TCL的文章,认真地对其进行了了解,也只能是了解.
▲英语言过程
至此我们已经可以写一个简单的文件格式了:
d_rect 10 10 150 50 2 blue
d_rect 7 7 153 53 2 blue
d_text 80 30 "Simple Drawing Tool" c red
example3/datafile.dat
d_rect from 10 10 to 150 50 thick 2 clr blue
example1/datafile.dat
rectangle 10 10 150 50 2 blue
rectangle 7 7 153 53 2 blue
text 80 30 "Simple Drawing Tool" c red
The first two lines of this file represent the data for two blue,
} elseif { [regexp \
{^text +([0-9]+) +([0-9]+) +("[^"]*") +([^ ]+) +(.*)$} \
$line dummy x y txt anchor color] } {
.c create text $x $y -text $txt -anchor $anchor -fill $color
set fid [open "datafile.dat" r]
while { ![eof $fid] } {
# Read a line from the file and analyse it.
gets $fid line
if { [regexp \
分析数据文件现在太容易了:
source "datafile.dat"
内建的TCL命令source读取文件,分析并执行文件中的命令.因为我们已经完成了d_rect和d_text过程,source命令将自动以正确的参数调用这两个过程.我们将d_rect和d_text称为分析过程.
说点题外话,我现在对计算机这一行,真的有些倦了,因为作为一个系统管理员,每天都有更新的东西在等待你去学习,必须不停地学,而不能有片刻的停顿,否则你就将面临被淘汰的危险,有时真的感觉很累,但没有办法,这就是生活,头天晚上你对着厚厚的书本说,我看到你就恶心,再也不想碰你了.但睡一觉醒来,你还是得把它当作一位良师,一位益友.
d_text 80 30 "Simple Drawing Tool" c red
看上去眼熟吗?调用过程的代码看上去与先前我们分析的代码几乎完全一样。唯一的不同之处是关键词由"rectangle"和"text"变成了"d_rect"和"d_text".
现在我们看到了写样本的技巧:为分析数据文件,我们要把它当作一个TCL脚本来对待。我们只把对我们写好的过程的调用放到一个文件中,并用此文件作为数据文件.设计样本的核心是数据文件实际上包含着对TCL过程的调用.
TCL脚本数据文件格式
简介
一个典型的tcl脚本把它的内部数据保存在列表和数组(tcl中两种主要的数据结构)中.比如,假定你想写一个能将数据先保存在磁盘上,然后再读取的tcl应用程序,
这将使你的用户可以先把一个项目保存下来,以后再重新装入.你需要一个办法,把数据从其内部存储处(列表与数组)写入到一个文件中,同样,也要有一个办法把数据从文件中读出装入到正在运行的脚本中去.
你可以选择把数据保存为二进制格式或文本格式.本文讨论的仅限文本格式,我们将考虑几种可能的数据格式及如何用tcl来进行分析.我们会特别介绍一些简单的技巧,使文本文件分析更容易.