puts \puts $label$Y
2.3 第3课:命令的赋值与置换一
讲解:
1. TCL中命令的赋值分为置换和赋值两个步骤 2. 续行符为 \\ 3. 转义符同为 \\ 4. 特殊字符列表:
序号 1 2 3 4 5 6 7 8 9 字符 \\a \\b \\f \\n \\r \\t \\v \\ddd \\xhh 输出 响铃 回车 清屏 换行 回车 制表符 垂直制表符(Vertical Tab) 八进制值 十六进制值 十六进制 \\x07 \\x08 \\x0c \\x0a \\x0d \\x09 \\x0b d=0-7 h=0-9,A-F,a-f 例子:004_eval.tcl
;# Show how a \\ affects the $ set Z \
set Z_LABEL \ork is: \
puts \
;# The next line needs a backslash to escape the '$'
puts \ ;# \\n换行; $100前的 \\ 必须有,否则会将100作为一个变量,提示出错
set a 100.00
puts \ ;# This is not what you want
puts \ ;# 显示$100,说明是后结合的,先置换了$a,此处严格的写应该写为 \\$$a puts \ ;# 显示$a
puts \ ;# 显示$100,说明是后结合的,先置换了$a
puts \puts \
puts \ ;# 行中 \\ 没有打印出来,如果要打印出来,需要写成 \\\\ puts \
on a single line\ ;# 当一行太长,不便于阅读,使用 \\ 做续行符
;#显示Albany
puts \ ;#显示$Z,被 \\ 转义
第 6 页 共 60 页
2.4 第4课:命令的赋值与置换二
讲解:
1.最外层是 {} 则不会进行置换操作,但其中的续行符仍然有效
例子:005_escape.tcl set Z \
set Z_LABEL \ork is: \
puts \ \\\ ;#and前的双引号前必须有\\ 进行转义,否则这个双引号回和前面的双引号结合, 导致成了 “xxx” and \\{“ 的结构,会提示出错
puts \ ;# 显示The Capitol of New York is: Albany
puts {$Z_LABEL $Z} ;# 显示 $Z_LABEL $Z,没有进行置换,{}中不会置换
puts \
puts \ ;# 最外层是双引号,所以进行了置换 puts {Who said, \最外层是花括号,所以没有进行置换
puts \
puts {There are no substitutions done within braces \\n \\r \\x0a \\f \\v} ;# puts {But, the escaped newline at the end of a\\
string is still evaluated as a space} ;#续行符仍然生效
2.5 第5课:命令的赋值与置换三
讲解:
1. [ ] 可以传递其中的命令结果,注意不能被 {} 包含;
2. 双引号包含的 [ ] 中的命令可以正常执行,命令结果也可以传出; 3. {} 包含的 [ ] 中的命令不会执行,更不会有命令结果传出来。
例子:006_escape.tcl set x \
puts \ ;#显示abc
set y [set x \ ;#先执行[]中的命令,将”def”赋值给x,然后将该命令的结果赋值给y puts \: $y\\n\ ;#显示x和y都是def
set z {[set x \ ;#由于在{}中,所以并没有执行对x的赋值,只是将{}赋值给z puts \
set a \ ;#执行了对x的赋值操作,并将值传出来赋给了a puts \puts \
第 7 页 共 60 页
set b \puts \puts \
2.6 第6课:算数运算
讲解: 1. 操作符 序号 1 2 3 4 5 6 7 8 9 10
2. 数学函数 序号 1 2 3 4 5 6 7 8 9 10
例子:007_math.tcl set X 100;
set Y 256 ;# 行末是否有分号都可以
set Z [expr \ ;# 变量是否被双引号包含都可以,不过建议使用双引号 set Z [expr $Y + $X]
set Z_LABEL \
函数 acos cos hypot sinh asin cosh log sqrt atan exp 序号 11 12 13 14 15 16 17 18 19 函数 log10 tan atan2 floor pow tanh ceil fmod sin 操作符 - + ~ ! * / % + - << >> & ^ | && || x?y:z 解释 - : 负号 + : 正号 ~ : 位操作非 ! : 逻辑非 * : 乘 / : 除 % : 取模 + : 加 - : 减 << : 循环左移 >> : 循环右移 & : 按位与 ^ : 按位异或 | : 按位或 && : 逻辑与 || : 逻辑或 if-then-else 第 8 页 共 60 页
puts \
puts \
puts \ is: [expr -3 * 4 + 5]\puts \ \\\
puts \ \\\
puts {$Z_LABEL [expr $Y + $X]} ;#外层是花括号不会进行置换 puts \ ;# 外层是双引号会进行置换 puts \
2.7 第7课:文本比较-SWITCH应用
讲解:
1. switch的分支中的命令使用花括号包含,但是并不会影响花括号中的命令执行,切记,这是switch的格式; 2. 如果不想分支条件进行置换,需要在外加上花括号,不会影响分支中的命令执行。
例子:008_switch.tcl
;# Set the variables we'll be comparing set x \set y 1; set z \
;# This is legal
switch $x \ ;#这种写法合法,但是阅读不便
switch $x \\
\ \ \\ \ \ \
;#下面这种写法$z被置换,走入$z的条件分支,表面上看条件分支中的命令在花括号内,这只是switch的一种格式,所以其中的命令仍然被执行了。
switch $x \\ \
{set y1 [expr $y+1]; puts \{set y1 [expr $y+1]; puts \{set y1 [expr $y+2]; puts \{set y1 [expr $y+3]; puts \
\ \ \
;# This form of the command disables variable substitution in the pattern
;#下面为了不置换$z,在外层加上了花括号,于是走入了ONE分支,而分支中的命令仍然被执行了 switch $x {
\ ;#这种写法好看一些,推荐
\{puts \
第 9 页 共 60 页
\ {set y1 [expr $y+1]; puts \{set y1 [expr $y+1]; puts \{set y1 [expr $y+2]; puts \{set y1 [expr $y+3]; puts \
\ \ \ }
\{puts \TCH\
2.8 第8课:数值比较-IF应用
讲解:
1. 条件式结果 数值 yes / no true / false FALSE 0 no false TRUE 非零 yes true 2.置换变量的方法,set y x ; puts $$y ,因为是后结合并且是一次置换,所以打出来的是 $x ,不是$x的值;但是在if的条件式中进行了二次置换, $$y 被置换成了 $x 的值
3.注意:新行中需要写为 } else { ,不能将 } 写到前一行的末尾,也不能省略 } 后面的那个空格,后面的 { 也需要写在当行,并且前面需要一个空格。
例子:009_if.tcl
set x 1;
if {$x == 2} {puts \ ;#判断是否相等使用 ==
if {$x != 1} { } else { puts \ }
if $x==1 {puts \ set y x;
if \ ;#在if条件式中$$y进行了二次置换 puts \ ;#在puts命令中,只进行了一次置换 } else { puts \ }
;#判断是否不等使用 !=
puts \
2.9 第9课:WHILE 循环
第 10 页 共 60 页