tcl常用命令

tcl有效命令行以命令+字符串形成;命令之间用换行符或分号隔开

置换($、[]、\)和引用("",{})的差别和联系

置换:变量置换、命令置换和反斜杠置换
变量置换:$, 置换的是变量的值。变量的名字字母、数字和下划线
命令置换:由[]括起来的TCL命令及其参数。TCL遇到 "[]" 时, 会将其内部识别为命令

反斜杠置换:在单词符号中插入诸如换行符、空格、【、$等被TCL等解释其当作特殊符号对待的字符。

\n、\t、\ddd、\xhh、\b

"" :对双引号中的各种分隔符不做处理,对换行符,$和 []置换符会照常处理
{} :

变量

数组:数字只能和数组元素一起声明。如%set day(monday) 1

list:表示集合。

{}、{a b c {}}。
语法:list ? value ...?
函数:concat list ?list...?
lindex list index
llength list
linsert list index value?value...?
lappend varname value ?value...?

相关命令

unset:删除变量,可有任意多个参数。使用:%unset a b day(monday)
append:把文本加到一个变量后面
incr:把一个变量值加上一个整数

eval、expr、source、exec的差别

expr: 语法:expr arg ? arg ...?
两个问号之间的参数表示可省。
eval:语法:eval arg?arg...?
接收一个或多个参数,把所有的参数组合在一起成为一个脚本,然后对这个脚本进行求值。

proc

TCL中的过程类似于C中的函数;

proc add {a b} {expr $x + $y}
proc 过程名 参数列表 过程体

可以用return命令返回需要的值;如果过程没有使用return命令,过程的返回值就是过程中最后一个命令的执行结果

三种参数形式:无参数;带有缺省值的参数;可变个数的参数(最后一个参数是args,表示这个过程支持可变个数的参数)

#无参数
proc abs {} {expr 3+5}
#带缺省值的参数
proc add {var1 {var2 10}} {return [expr $var1+$var2]}
#可变个数的参数
proc avg {args} {
set sum 0
foreach arg $args{set sum [expr $sum+$arg]}
set avg [expr $sum/[llength $args]]
return $avg
}

在所有过程之外定义的变量称为全局变量,在过程内部定义的变量称为局部变量,在过程内部引用一个全局变量的值,使用global命令

字符串操作

因为TCL把所有的输入都当作字符串看待,所以TCL提供了较强的字符串操作功能
format: format formatsting ?value value..?

set name Jone
set age 20
set msg [format "%s is %d years old" $name $age]

scan: scan string format varname ?varname...?

scan "some 26 34" "some %d %d" a b
set a
set b

regexp ?选项? 正则表达式 字符串 ?变量1 变量2?

常用选项: -nocase:忽略大小写; -inline:返回匹配结果,而不是返回值。

regsub ?-all? ?-nocase? exp string subspec varname

-all : 全局替换所有符合正则表达式的匹配项
-nocase:忽略大小写
exp:正则表达式
string:目标字符串
subspec:替换规则
varname:替换后的结果存储在此变量中

文本操作

open name ?access?
返回供其他命令使用的文件标识(gets,close)
r; r+; w; w+; a; a+;
管理当前工作目录:pwd和cd;
文件名操作: glob和file,操作文件或获取文件信息;
glob ?switches? pattern? pattern...?
file option ?arg arg ..?
atime:获取或设置文件的访问时间
copy:复制文件
mkdir:创建目录。
owned:检查文件是否属于当前用户。
executable:检查文件是否可执行。

{ * }配合glob等返回list后的操作

{* } 参数展开语法,把列表元素作为独立参数提供给指令
file delete {* } [glob *.tmp]
等同于 eval file delete [glob *.tmp]

控制流:

if test1 body1 ?else bodyn?

if {$x>0}{

}elseif{$x==-1}{

}else{

}

while test body

while {$i>0}{

}

for init test reinit body

for {set i [expr [llength $a] -1]} {$i>=0} {incr i -1}{
lappend b [lindex $a $i]
}

foreach varname list body

foreach i $a{

}

switch:根据不同的条件执行不同的代码块。
switch ?option? string { pattern body ?pattern body...?}
option:-exact(精确匹配);-regexp(正则表达式);-glob(string match 默认)

switch $fruit{
"apple" {
		puts "this is an apple"
	}
"banada" {
		puts "this is a banana"
	}
default {
		put "i dont know"
	}
}

在循环体中,用break和continue命令中断循环。
source:执行脚本文件;读一个文件并把这个文件的内容作为一个脚本进行求值。
source hello.tcl

posted @ 2023-09-15 20:17  yoy116  阅读(1026)  评论(0)    收藏  举报