Tcl / Tk 大全 作者:陆绍飞 会员名:lsf 中国互动出版网http://www.china-pub.com
set str \string length $str;
这一命令给出的长度为2 3 (l e n g t h 选项对空格字符也计算在内)。现在,让我们来获取在$s t r 字符串中第一次和最后一次出现字符串“s t ”的位置:
string first \string last \
这两个命令给出第一次出现“t ”的值为1 3 (相应于在Te s t 中出现的位置),最后一次出现“s t ”的值也为1 3 (还是Te s t )。在S t r i n g 中出现的“t ”为什么不算数呢?这是因为大多数字符串比较函数是区分大小写和空格的,下面的代码将首先把$s t r 转换为小写字体,然后再执行查找:
string last \
此时,这一命令给出的值为1 6 ,它相应于S t r i n g 中的“s t ”。最后,让我们来删除$ s t r 字符串前后的空格,然后获取这一字符串的长度:
string length [string trim $str \
该命令的返回值为2 1 ,这意味着已经删除了第一个和最后一个空格。 (注意,这个与JAVA的trim不同) 33.2.6 数字的操作
t c l 提供两个操作数字变量和常数的命令:i n c r 和e x p r 。
t c l 中的i n c r 命令等价于C 语言中的操作符+ =、- =、+ +和- -,它的基本语法是:
incr variable integer
这里的v a r i a b l e 必须是一个整数,i n c r 命令将把给定的i n t e g e r 添加到v a r i a b l e 上,因此减法可通过提供负整数来执行。现在让我们演示一下它的用法。首先,创建一个变量,并对这个变量执行i n c r :
set a 81; incr a; puts $a;
$ a 此时具有的值为8 2 。在缺省情况下,i n c r 与+ +相同;当没有提供i n t e g e r 变元时,i n c r 将把1 添加到所指定的变量上。现在,如果要从$ a 上减3 ,可利用如下命令:
incr a -3 puts $a
可以看到,$ a 具有的值为7 9 。最后一点需要说明的是,这里的i n t e rg e r 可以是某个变量的值,例如:
set a 6; set b 9; incr a $b; puts $a;
此时$a 具有的值为1 5 。对于较复杂的数学操作,t c l 提供了e x p r 命令,这一命令对所有标准的ANSI C 操作符有效,操作符的优先级大部分与ANSI C 中的优先级相同。 当需要执行算术操作时,必须把e x p r 命令放在算术操作之前,例如:
set a 20; set b 4; set c $a/$b; puts $c;
上述命令产生的输出结果为:
9
Tcl / Tk 大全 作者:陆绍飞 会员名:lsf 中国互动出版网http://www.china-pub.com
20/4
而不是所想要的结果5 。为了获得正确的答案,需要利用e x p r 命令,例如:
set c [expr $a/$b];
除了标准操作符+、-、*、/之外,还可以为e x p r 提供几个能够使它执行其他数学操作的选项。e x p r 命令的基本语法是:
expr function number
e x p r 能够识别的一些函数及其返回的值如下:
a b s ( x ) x 的绝对值
r o u n d ( x ) x 舍入后所得到的整数值 c o s ( x ) x 的余弦( x 为弧度) c o s h ( x ) x 的双曲余弦 a c o s ( x ) x 的反余弦( 0 到??) s i n ( x ) x 的正弦( x 为弧度)
s i n h ( x ) x 的双曲正弦( ?p/ 2 到p/ 2 ) a s i n ( x ) x 的反正弦( ?p/ 2 到p/ 2 ) t a n ( x ) x 的正切( x 为弧度) t a n h ( x ) x 的双曲正切
a t a n ( x ) x 的反正切( ?p/ 2 到p/ 2 ) e x p ( x ) e 的x 次幕 l o g ( x ) x 的自然对数
l o g 1 0 ( x ) x 的底为1 0 的对数 s q r t ( x ) x 的平方根
下列数学函数采用两个数字变元: p o w ( x , y ) x 的y 次幂 这个函数的用法如下:
set a 2;
set b [expr pow($a,3)]; puts $b;
这些命令产生的输出结果为8 . 0 ,即2 的3 次幕的值。
5.6 引用和置换
引用和置换被大量应用于与变量有关的操作。在本章的前面,我们曾提到过引用(利用双引号构成字符串)和置换的最基本形式。t c l 还支持另一种类型的引用,即花括号引用,以及另一种类型的置换,即命令的置换。回顾过去,我们知道双引号的主要用途是创建具有内嵌空格的字符串,例如:
set kiwi \
双引号也可以用来创建多行的字符串,例如:
set kiwi \New Zealand 3 for a dollar\
除创建多行字符串外,在t c l 字符串中还可以使用ANSI C 语言的标准转义序列,例如:
set kiwi \
这一命令的输出结果如下:
Fresh from New Zealand
10
Tcl / Tk 大全 作者:陆绍飞 会员名:lsf 中国互动出版网http://www.china-pub.com
3 for a dollar\
除此以外,在双引号之间的字符串可以应用两种类型的置换。第一种类型的置换,也就是 变量置换,在本章前面“变量”一节中已经做过说明。在利用双引号引起来的字符串中,你可以通过在变量名前添加$来访问该变量的值、因此下面的命令:
set fruit kiwi;
set place \set how_many 3;
puts \
输出的结果为:
kiwi, fresh from New Zealand, 3 for a dollar
另一种类型的置换是命令置换。命令置换块以左括号( [ )开始,以右括号( ] )结束,例如:
set len_in 2; puts \
这一行代码的输出结果为:
2 inches is 5.08 cm
5 . 0 8 是命令
expr $len_in*2.54
产生的结果。
由于这一命令位于括号中,因此它的返回值将被替换进去。在本例中,我们使用的是t c l 命令e x p r ,不过任何t c l 命令都可以放在括号之中。命令置换可用于大多数命令中,而不只限于由双引号括起来的命令,例如:
set len_in 2;
set len_cm [expr $len_in*2.54]; puts \
这几个命令产生的输出结果与下面一行代码相同:
set len_in 2; puts \
可以在t c l 中使用的另一种类型的引用是花括号的引用,这种类型的引用类似于UNIX shell 中单引号的使用。花括号的引用将利用给定的字符来创建字符串集,其中不进行置换(命令置换或变量置换),并且也不对C 语言的转义序列进行解释,例如:
puts \
这一命令产生的输出结果为:
This is a multi-line string
而下面的命令
puts {This\\nis a \\nmulti-line\\nstring}
产生的输出结果为:
This\\nis a \\nmulti-line\\nstring
要想在花括号括起来的字符串中使用制表符、换行符以及其他的特殊字符,必须按原样实 际地输入它们,例如:
puts{This is a multi-line string}
11
Tcl / Tk 大全 作者:陆绍飞 会员名:lsf 中国互动出版网http://www.china-pub.com
这一命令将产生想要的输出结果。利用花括号括起来的字符串,其真正的用途在于把某些 具有特殊意义的字符作为值提供给变量,例如:
set price 1.00 ;
puts \
这两个命令的输出结果为:
Pears,$1.00 per pound
然而,$ $ p r i c e 有可能会引起混乱,因此最好的办法是使变量p r i c e 具有的值为$ 1 . 0 0 。你可以利用花括号像下面这样来达到目的:
set price {$1.00};
puts \
花括号引用的另一个用途是推迟求值,并用于控制结构和过程的定义。在这些情况下,当 读取整个代码块后,变量的值将被置换进去。
5.7 流的控制 IF 和 SWITCH
t c l 提供几个用来控制流的命令,并且支持有关字符串和数字的所有ANSI C 的标准比较操作符。本节将从i f / e l s e i f / e l s e 命令开始讨论。下面显示的是一个最简单的i f 语句:
if {$x<0}{ set x 10; }
警告T C L 对花括号和空格的使用是十分苛刻的。在i f ,e l s e i f 或e l s e 语句中的开始的花括号必须要和i f ,e l s e i f 或e l s e 在同一行中。而括号外必须是有一个空格。且e l s e 或e l s e i f语句必须要在前一个if 或elseif 的后括号的同一行中。
这个例子在i f 语句体中只有一行代码,不过你可以添加任何数量的行和子语句块。如果需 要执行其他条件的判断,那么每个判断可以像下面那样在括号中给定:
if {($x==\puts \}
判断也可以像下面例子所示的那样进行嵌套:
if {(($arch==\puts \}
要把else 语句体添加到if 语句,可以像下面这样来完成:
if {$x <= 0} { set x 10; } else { set x 0; }
你还可以根据需要添加任意多的elseif 语句:
if {$x == 0} { set x 10;
} elseif {$x == 10} { incr x -1;
} elseif {$x == 100} {
12
相关推荐: