发信人: chenhao (努力学习), 信区: Linux
标 题: Tcl简介(二):Tcl 内建命令 发信站: 北大未名站 (2000年11月24日00:47:29 星期五) , 转信 Tcl简介(二):Tcl 内建命令 作者:Bricks Tcl 内建命令 Built-in commands 内建的命令 Tcl提供了下面描述的内建函数。 ... 表示参数不定 append varName value append varName value value value ... 将那一大堆value附加到varName后面。如果变量不存在,会新 建一个。 例子: set i "aaa" append i "bbb" "ccc" //i = aaabbbccc array subcommand arrayName array subcommand arrayName arg ... 这是一组用于向量操作的命令。第二个参数是子命令名。 假设: set a(1) 1111 set a(2) 2222 set a(three) 3333 一下均以它为例子(tclsh在中运行)。 array names arrayName 返回一个数组元素名字的列表。 tclsh>array names a 1 2 three array size arrayName 返回数组的元素个数。 tclsh>array size a 3 下面是用于遍历的命令 arrry startsearch arrayName 初始化一次遍历,返回一个遍历标示(searchId)在下面的命令 是中使用。 array nextelement arrayName searchId 返回下一个数组中的元素。如果没有返回一个空串。 array anymore arrayName searchId 返回 1 表示还有更多的元素。0 表示没有了。 array donesearch arrayName searchId 结束该次遍历。 array nextelement arrayName searchId 返回下一个元素。 tclsh>array startsearch a s-1-a tclsh>array nextelement a s-1-a 1111 tclsh>array nextelement a s-1-a 2222 tclsh>array anymore a s-1-a 1 tclsh?array nextelement a s-1-a 3333 tclsh>array donesearch a s-1-a 注意可以同时并发多个遍历。 break 跳出最近的循环。 case string in patList body ... case string patList body ... case string in {patList body ...} case string {patList body ...} 分支跳转。 例如: case abc in {a b} {puts 1} default {puts 2} a* {puts 3} return 3. case a in { {a b} {format 1} default {format 2} a* {format 3} } returns 1. case xyz { {a b} {format 1} default {format 2} a* {format 3} } returns 2. 注意default不可以放在第一位。支持shell文件名风格的匹配 符。 catch command catch command varName 用于阻止由于错误而导致中断执行。执行command, 每次都返 回TCL_OK, 无论是否有错误发生。如有错误发生返回1 ,反之返回0 。如果给了varName这被置为错误信息。注意varName是已经存在的 变量。 cd cd dirName 转换当前工作目录。如dirName未给出则转入home目录。 close fileId 关闭文件描述符。 concat arg ... 将参数连接产生一个表。 concat a b {c d e} {f {g h}} return `a b c d e f {g h}' continue 结束该次循环并继续循环。 eof fileId 如fileId以结束 返回1,反之返回 0。 error message error message info error message info code 返回一个错误,引起解释器停止运行。info用于初始化全局变 量errorInfo。code被付给errorCode。 eval arg ... 将所有的参数连起来作为命令语句来执行。 exec arg ... 仿佛是在shell下执行一条命令。 exec ls --color exec cat /etc/passwd > /tmp/a exit exit returnCode 中断执行。 expr arg 处理表达式。 set a [expr 1+1] //a=2 file subcommand name 一组用于文件处理的命令。 file subcommand name arg ... file atime name 返回文件的最近存取时间。 file dirname name 返回name所描述的文件名的目录部分。 file executable name 返回文件是否可被执行。 file exists name 返回1 表示文件存在,0 表示文件不存在。 file extension name 返回文件的扩展名。 file isdirectory name 判断是否为目录。 file isfile name 判断是否为文件。 file lstat name varName 以数组形式返回。执行lstat系统函数。存储在varName。 file mtime name 文件的最近修改时间。 file owned name 判断文件是否属于你。 file readable name 判断文件是否可读。 file readlink name 都出符号连接的真正的文件名。 file rootname name 返回不包括最后一个点的字符串。 file size name 返回文件的大小。 file stat name varName 调用stat内和调用,以数组形式存在varName中。 file tail name 返回最后一个斜线以后的部分。 file type name 返回文件类型file, directory, characterSpecial, blockSpecial, fifo, link, 或 socket。 file writable name 判断文件是否可写。 flush fileId 立即处理由fileId描述的文件缓冲区。 for start test next body for循环。同C总的一样。 for {set i 1} {$i < 10} {incr i} {puts $i} foreach varname list body 类似于C Shell总的foreach或bash中的for..in... format formatString format formatString arg ... 格式化输出,类似于C中的sprintf。 set a [format "%s %d" hello 100] //a="hello 100" gets fileId gets fileId varName 从文件中读出一行。 set f [open /etc/passwd r] gets $f glob filename ... glob -nocomplain filename ... 使用C Shell风格的文件名通配规则,对filename进行扩展。 ls /tmp a b c tclsh>glob /tmp/* a b c 当加上参数 -nocomplain 时,如文件列表为空则发生一个错 误。 global varname ... 定义全局变量。 if test trueBody if test trueBody falseBody if test then trueBody if test then trueBody else falseBody 条件判断,是在没什么说的。 incr varName incr varName increment 如果没有incremnet,将varName加一,反之将varName加 上increment。 set i 10 incr i //i=11 incr i 10 //i=21 info subcommand info subcommand arg ... 取得当前的Tcl解释器的状态信息。 info args procname 返回由procname指定的命令(你自己创建的)的参数列表。 如: proc ff { a b c } {puts haha} info args ff //return "a b c" info body procname 返回由procname指定的命令(你自己创建的)的函数体。 如: proc ff { a b c } {puts haha} info body ff //return "puts haha" info cmdcount 返回当前的解释器已经执行的命令的个数。 info commands info commands pattern 如果不给出模式,返回所有的命令的列表,内建和自建的。 模式是用C Shell匹配风格写成的。 info complete command 检查名是否完全,有无错误。 info default procname arg varname procname的参数arg,是否有缺省值。 info exists varName 判断是否存在该变量。 info globals info globals pattern 返回全局变量的列表,模式同样是用C Shell风格写成的。 info hostname 返回主机名。 info level info level number 如果不给参数number则返回当前的在栈中的绝对位置,参 见uplevel中的描述。如加了参数number,则返回一个列表包 含了在该level上的命令名和参数。 info library 返回标准的Tcl脚本的可的路径。实际上是存在变量 tcl_library中。 info locals info locals pattern 返回locale列表。 info procs info procs pattern 返回所有的过程的列表。 info script 返回最里面的脚本(用 source 来执行)的文件名。 info tclversion 返回Tcl的版本号。 info vars info vars pattern 返回当前可见的变量名的列表。 下面是一些用于列表的命令,范围可以是end。 join list join list joinString 将列表的内容连成一个字符串。 lappend varName value ... 将value加入列表varName中。 lindex list index 将list视为一个列表,返回其中第index个。列表中的第一个 元素下标是0。 lindex "000 111 222" 1 111 linsert list index element ... 在列表中的index前插入element。 list arg ... 将所有的参数发在一起产生一个列表。 list friday [exec ls] [exec cat /etc/passwd] llength list 返回列表中元素的个数。 set l [list sdfj sdfjhsdf sdkfj] llength $l //return 3 lrange list first last 返回列表中从frist到last之间的所有元素。 set l [list 000 111 222 333 444 555] lrange $l 3 end //return 333 444 555 lreplace list first last lreplace list first last element ... 替换列表中的从first到last的元素,用element。 set l [list 000 111 222 333 444 555] lreplace $l 1 2 dklfj sdfsdf dsfjh jdsf 000 dklfj sdfsdf dsfjh jdsf 333 444 555 lsearch -mode list pattern 在列表中搜索pattern,成功返回序号,找不到返回-1。 -mode : -exact 精确 -glob shell的通配符 -regexp 正则表达式 lsearch "111 222 333 444" 111 //return 0 lsearch "111 222 333 444" uwe //return 1 lsort -mode list 排列列表。 -mode : -ascii -dictionary 与acsii类似,只是不区分大小写 -integer 转化为整数再比较 -real 转化为浮点数再比较 -command command 执行command来做比较 open fileName open fileName access 打开文件,返回一个文件描述符。 access r w a r+ w+ a+ 定义与C中相同。如文件名的第一个字符为|表示一管道的形式 来打开。 set f [open |more w] set f [open /etc/pass r] proc name args body 创建一个新的过程,可以替代任何存在的过程或命令。 proc wf {file str} { puts -nonewline $file str flush $file } set f [open /tmp/a w] wf $f "first line\n" wf $f "second line\n" 在函数末尾可用 return 来返回值。 puts -nonewline fileId string 向fileId中写入string,如果不加上 -nonewline 则自动产 生一个换行符。 pwd 返回当前目录。 read fileId read fileId numBytes 从fileId中读取numBytes个字节。 regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...? 执行正则表达式的匹配。 switches? -nocase 不区分大小写 -indices 返回匹配区间 如: regexp ^abc abcjsdfh //return 1 regexp ^abc abcjsdfh a //return 1 puts $a //return abc regexp -indices ^abc abcsdfjkhsdf a //return 1 puts $a //return "0 2" regsub ?switchs? exp string subSpec varName 执行正则表达式的替换,用subSpec的内容替换string中匹配exp 的部分。 switchs? -all 将所有匹配的部分替换,缺省子替换第一 个,返回值为替换的个数。 -nocase 不区分大小写。 如: regsub abc abcabcbac eee b //return 1 puts $b //return "eeeabcabc" regsub -all abc abcabcabc eee b //return 3 puts $b //return "eeeeeeeee" return 立即从当前命令中返回。 proc ff {} { return friday } set a [ff] //a = "friday" scan string `format' varname ... 从string中安format来读取值到varname。 seek fileId offset ?origin? 移动文件指针。 origin: start current end offset从哪里开始算起。 set varname ?value? 设置varname用value,或返回varname的值。如果不是在一 个proc命令中则生成一个全局变量。 source fileName 从filename中读出内容传给Tcl解释起来执行。 split string ?splitChars? 将string分裂成列表。缺省以空白为分隔符,也可通 过splitChars来设定分隔符 string subcommand arg ... 用于字符串的命令。 string compare string1 string2 执行字符串的比较,按 C strcmp 的方式。返回 -1, 0, or 1。 string first string1 string2 在string1种查找string2的定义次出现的位置。未找到返回-1。 string length string 返回字符串string的长度。 string match pattern string 判断string是否能匹配pattern。pattern是以shell文件名的 统配格式来给出。 string range string first last 返回字符串string中从first到last之间的内容。 string tolower string 将string转换为小写。 string toupper string 将string转换为大写。 string trim string 将string的左右空白去掉。 string trimleft string 将string的左空白去掉。 string trimright string 将string的右空白去掉。 tell fileId 返回fileId的文件指针位置。 time command 执行命令,并计算所消耗的时间。 time "ls --color" some file name 503 microseconds per iteration trace subcommand trace subcommand arg ... 监视变量的存储。子命令定义了不少,但目前只实现了 virable。 trace variable name ops command name 为变量的名字。 ops 为要监视的操作。 r 读 w 写 u unset command 条件满足时执行的命令。 以三个参数来执行 name1 name2 ops name1时变量的名字。当name1为矢量时,name2为下标,ops 为执行的操作。 例如: proc ff {name1 name2 op} { puts [format "%s %s %s" name1 name2 op] } set a hhh trace variable a r {ff} puts $a //return "a r\nhhh" unknown cmdName unknown 并不是 Tcl 的一部分,当 Tcl 发现一条不认识的命 令时会看看是否存在 unknown命令,如果有,则调用它,没有则出 错。 如: #!/usr/bin/tclsh proc unknown {cwd args} { puts $cwd puts $args } //下面是一条错误命令 sdfdf sdf sdkhf sdjkfhkasdf jksdhfk //return "sdfdf sdf sdkhf sdjkfhkasdf jksdhfk" unset name ... 删除一个或多个变量(标量或矢量)。 uplevel command ... 将起参数连接起来(象是在concat中)。最后在由level所指 定的上下文中来执行。如果level是一个整数,给出了在栈中的距 离(是跳到其它的命令环境中来执行)。 缺省为1(即上一层)。 如: #!/usr/bin/tcl proc ff {} { set a "ff" //设置了局部的a ------------------------- } set a "global" ff puts $a //return "global" 再看下一个: #!/usr/bin/tcl proc ff {} { uplevel set a "ff" //改变上一级栈中的a ------------------------------------- } set a global ff puts $a //return "ff" 如果level是以#开头后接一个整数,则level指出了在栈中的 绝对位置。如#0表示了顶层(top-level)。 a b c 分别为三个命令,下面是它们之间的调用关系, top-level -> a -> b -> c -> uplevel level 绝对位置: 0 1 2 3 当level为 1 或 #2 都是在 b 的环境中来执行。 3 或 #0 都是在 top-level 的环境中来执行。 upvar ?level? otherVar myVar ?otherVar myVar ...? 在不同的栈中为变量建立连接。这里的level与uplevel中 的level是同样风格的。 例如: #!/usr/bin/tcl proc ff {name } { upvar $name x set x "ff" } set a "global" ff a puts $a //return "ff" while test body 举个例子吧: set x 0 while {$x<10} { puts "x is $x" incr x } Built-in variables 内建的变量 下名的全局变量是由 Tcl library 自动来管理的。一般是只 读的。 env 环境变量数组。 如: puts $env(PATH) // return /bin:/usr/bin:/usr/X11R6/bin errorCode 当错误发生时保存了一些错误信息。用下列格式来存储: CHILDKILLED pid sigName msg 当由于一个信号而被终止时的信息。 CHILDSTATUS pid code 当一个子程序以非0值退出时的格式。 CHILDSUSP pid sigName msg 当一个子程序由于一个信号而被终止时的格式。 NONE 错误没有附加信息。 UNIX errName msg 当一个内核调用发生错误时使用的格式。 errorInfo 包含了一行或多行的信息,描述了错误发生处的程序和信息。 原文的作者也是Tcl的缔造者 John Ousterhout (`ouster@sprite.berkeley.edu')写于伯克利分校。 Tcl简介(三):Tcl 内建命令 本文章版权属Bricks with GNU&LINUX所有。 -- ※ 来源:.北大未名站 bbs.pku.edu.cn [FROM: 162.105.45.129] |
|