当前位置:文档之家› TCL语言编程_NX

TCL语言编程_NX

一)、准备知识:TCL语言—脚本语言P87(注:本文所列程序全部通过了验证)1、安装软件:ActiveTcl8.5,软件的打开和退出(exit)2、格式:命令选项参数1 参数2 参数3….参数N注:中间必须用空格或TAB隔开交互式与非交互式:TCL的一个命令行,以交互式的方式执行,边编制边执行;TCL脚本程序是以非交互式的方式运行,通过SOURCE打开执行。

讲课时会分别进行演示。

特殊符号的使用:;-----分开命令行# ------解释,写在命令行后,单独一行时可不写“;”$ ----置换变量的值,可用到二重置换\ -----反斜杠置换,对引用特殊符号分配特种功能比如\n 换行;\t 空格;\$ 关闭$的置换功能;\ 用在引用中可续行(持续添加字符串);紧跟在字符串后用于连接后面的字符串[ ] ----置换嵌套命令,返回最后一个命令的值注:置换是指取出变量的值或变量运算后的返回值;有的书上称为替换。

" "-----引用标记字符串为一个参数,如出现换行、$和[ ]等置换命令仍有效{ }-------引用标记字符串为一个参数,视所有字符视为普通字符,置换无效4、表达式:expr 数学运算可以运算+ - * \ sqrt 三角函数5、变量:变量的类型分为标量和数组, 变量名区分大小写.对变量赋值时,数据类型不用指定(默认为10进制整数),也无须提前声明,如果想改变数据类型必须按规定格式书写,如通过int double 来改变参与运算的参数类型。

当标记字符串为一个参数,如出现$等置换命令仍有效;程序外的变量是全局性的:子程序内不能看到,但用全局命令global 就可以在子程序内外都可以看到。

6、赋值与显示变量内容(置换)set 变量参数注:参数可以是表达式或变量置换等,清除已赋数据使用unsetputs $变量(有时在puts后会写上标准输出stdout—标准输出)练习:(1)对参数a 和b分行赋值,并显示执行结果(2)利用puts输出字符串功能,显示如下结果ABCDEFGHIJKLMNO(3)定义a1.1为变量,并赋值为20,将变量a1.1的值赋给变量b,最后显示变量b的值(4)算术计算:a. 求4÷7的值,小数点保留3位(预先通过tcl内部变量tcl_precision定义小数点位,缺省值tcl_precision=0小数点为12位)b.已知一直角三角形,斜边长为10mm,一直角边长6,求另一直角边长举例:jisuan.tclset c 10set b 6set a [expr sqrt($c*$c-$b*$b)]puts "Another edge len= $a"或交互式执行set c 10;set b 6\;puts "Another edge len= [expr sqrt($c*$c-$b*$b)]"7、集合:list格式:list 集合元素赋值set 变量[list集合元素]list结构下标是从零开始,引用方式使用命令:lindex ,格式:lindex 集合元素位置如:显示集合yy的第二个元素set yy [list 0 ac 1 vy 2 ii 3 p]puts " [lindex $yy 1] "列出所有元素使用foreach 循环;格式:set i 0;foreach j $yy { ;puts "$j is item number $i in list yy"incr i;}获取list中的元素个数:llength $list8、数组:(重点掌握一维数组)一维数组格式:数组名(下标)下标下标可以是任何字符,对数组赋值同样使用set命令,清除使用unset 数组名有关数组的关键指令:*array格式:array 选项数组关系项(1)判断数组是否存在:array exists 数组名,存在返回值1 ;否则0(2)对数组赋值:array set 数组名相关项(相关项为一个变量,存放下标和赋值)(3)获取数组的个数(列数):array size 数组名(4)获取数组内容和下标变量:array get 数组名(5)获取数组id :array startsearch 数组名返回第一项id(6)浏览数组:使用foreachforeach id [array names yy] { ;puts "$yy($id) has ID: $id"}可通过list命令对数组赋值格式:array set 数组名[list 下标赋值……]输出数组全部内容格式parray 数组名练习:(1)将数组hh(0)=”abc” hh(1)=”cd” hh(2)=”efg”赋给数组gt,并输出gt(2)的内容set ad "0 abc 1 cd 2 efg"\;array set hh $ad\;array set gt[array get hh]parray gt(2)将刀具参数定义为一维数组,并显示举例:set str "dia 10 rad 5 len 50"array set tool $strforeach {key value} [array get tool] {puts "$key: $value" }或parray tool9、字符串操作:格式:string 选项字符串1 字符串2 …….定义字符串格式:set 参数引用字符串(1) string length----返回字符串长度格式:string length 字符串名(2) string index-----返回字符串中所在下标字符格式:string index $字符串名位置(3) string range---返回字符串中所在范围的字符格式:string range $字符串名起始位终止位注:标示位上的字符也将被返回(4) string compare string1 string2---字符串比较返回:-1 :string1比string2小0 :string1和string2相等1 :string1比string2大(5) string first string1 string2 ----返回string1在string2中第一次出现的位置;如果string2不在string1中,返回-1(6) string last string1 string2 ----返回string1在string2中最后一次出现的位置;如果string2不在string1中,返回-1(7) string wordstart string1 index ---返回string1中index处的字符的开始位置(8) string wordend string1 index ---返回string1中index处的字符的结束位置(9) string match pattern string1 ---返回string1中是否满足匹配模式pattern匹配模式的通配符:. 匹配任意单个字符^ 表示从头进行匹配$ 表示从末尾进行匹配\x 转义符,匹配字符x,这可以抑制字符x的含义[chars] 匹配字符集合chars中给出的任意字符,如果chars中的第一个字符是^,表示匹配任意不在chars中的字符,chars的表示方法支持a-z之类字符区间的表示。

(regexp) 把regexp作为一个单项进行匹配* 对*前面的项0进行次或多次匹配+ 对+前面的项进行1次或多次匹配? 对?前面的项进行0次或1次匹配regexp1|regexp2 匹配regexp1或regexp2中的一项注:因为tcl区分大小写,所以对字符串操作前需要统一转化为小写,格式:string tolower $字符串(转化大写时使用toupper)(10) format 函数:用于定义参数的输出数据格式格式:format 格式串参数1 参数2…例:输出2位小数puts [format "5/3= %.2f " [expr 5./3]]*format 的逆函数:scan格式:scan 字符串格式参数1 参数2例:scan "the number 4.000" "%s%s%f" a b c\; puts "$a,$b,$c";#输出结果the,number,4.0字符串格式如下:序号格式描述1 s 字符串2 d 十进制整数3 x 十六进制数值4 o 八进制数值5 f 浮点数6 - 左对齐7 + 右对齐,不指定–或+ ,缺省是右对齐(11)**字符串的查找和替换:使用规则表达式(有的书上称为正规或正则表达式)*查找格式如下:regexp 开关项{规则表达式1 通配符*或+规则表达式2} $被查找字符串变量1 变量2 变量3开关项----nocase,匹配时不考虑大小写;-indices 改变各个变量为位置索引;-about 返回规则表达式本身的信息,而不是对缓冲区的解析。

返回的是一个list,第一个元素是子表达式的个数,第二个元素开始存放子表达式的信息;-expanded 启用扩展的规则,将空格和注释忽略掉,相当于使用内嵌语法(?x);-line 启用行敏感匹配;-linestop 启动行结束敏感开关,使^可以匹配缓冲区内部的新行。

相当于内嵌语法(?p);-lineanchor 改变^和$的匹配行为,使可以匹配缓冲区内部的新行。

相当于内嵌语法(?w) ;-all匹配全部,默认匹配首个;-- 表示这后面再没有开关(switchs〕了,即使后面有以'-'开头的参数也被当作规则表达式的一部分。

变量1 ---接受满足整个规则表达式的字符变量2 ---接受满足规则表达式1的字符变量3 ---接受满足规则表达式2的字符regexp命令用于判断规则表达式exp是否全部或部分匹配字符串string,匹配返回1,否则0同事实现变量的赋值。

举例:(1)set yy " 01a and 01A is two different harcters"regexp {( [0-9]+)+([A -Z]+) } $yy rt gh klputs "$rt, $gh, $kl"返回结果:01A , 01, A(2)set yy " 01A and 01a is two different harcters"regexp {( [0-9]+)+([A -Z]+) } $yy rt gh klputs "$rt, $gh, $kl"返回结果:01A , 01, A上两个例子处理结果一样,其实实际匹配是不一样的。

相关主题