相关阅读
Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm=1001.2014.3001.5482
在前面的内容中已经提到,Tcl是一种基于字符串的命令语言。理解这一点非常重要,因为Tcl中的变量、表达式以及命令参数,本质上都与字符串处理密切相关。也正因为如此,学习Tcl时,除了掌握命令本身,还需要理解Tcl的几种“置换”机制,也就是Tcl在执行命令前会先对参数做哪些展开和替换。
本文主要介绍Tcl中的变量,以及最常见的三种置换方式:变量置换、命令置换和反斜杠置换。
变量
set命令用来给一个变量赋值。它接受两个参数,第一个参数是变量的名字,第二个参数是一个值。变量的名字可以是任意长度的,且区分大小写。需要注意的是,不像C等语言,Tcl语言的变量名可以使用数字开头且可以使用特殊字符(除了::外),所以下面的都是有效的Tcl赋值格式。不过,虽然Tcl在“定义变量”时对变量名非常宽松,但在后续进行变量置换时,解释器默认只会把$后面那段符合常规形式的内容识别为变量名。通常来说,最容易被正确解析的是由字母、数字和下划线构成的变量名。如果变量名包含特殊字符(除数字、字母、下划线外的其他字符),需要用{}将变量名包围才能正确完整解析。
%set a 1 %set 1 1 %set _1 1 %set #_1 1 %set $ 1 #如果变量名有特殊字符,使用{}进行变量替换 %set c ${#_1}变量置换
当定义了变量的值后,我们就可以引用变量从而使用变量的值,但是需要注意的是,在引用一个变量的值时需要在变量名前加$。
%set a 10 #定义a为字符串"10" 输出 10 #这里表示输出为10 %set b a #定义b为字符串"a",而不是字符串"10" 输出 a #输出并不是10,因为没有进行变量替换 %set b $a #定义b为字符串"10" 输出 10 #此时进行变量替换,$a被替换为a的值,即字符串"10" %set b $a+1 #定义b为字符串"10+1" 输出 10+1 #可以看到结果并不是11,因为Tcl是基于字符串处理的,默认不会进行表达式计算在上面代码的最后,我们尝试把b的值设定为表达式10+1计算的结果, 但Tcl默认把内容当作字符串处理,并不会自动把它当成数学表达式去计算。也就是说,变量置换只负责把$a替换成它的值10,并不会进一步去计算10+1。如果想让Tcl对表达式求值,就需要用到下面要介绍的命令置换。
命令置换
命令置换的作用,是让一个命令的返回值成为另一个命令的参数。在Tcl中,只需要用中括号[]把命令括起来,就可以完成命令置换。这意味着:在外层命令真正执行之前,Tcl会先执行中括号中的命令,然后把它的返回结果替换到原来的位置。
% set a 1+1 #Tcl不会计算表达式,因此结果为字符串"1+1" 输出 1+1 % set a [expr 1+1] #expr命令将后面的一个或多个参数当做可以计算的表达式 输出 2 %set a 10 输出 10 %set b [expr $a+1] #首先执行expr命令并进行变量替换,然后将expr命令的返回值即表达式计算的结果当做set的第二个参数 输出 11可以看到在上例中的最后,我们同时使用了变量置换和命令置换,其中expr的参数$a+1被替换为字符串10+1,然后expr命令执行,结果为字符串11,随后set命令的第二个参数被替换为字符串11,因此最后b的值为字符串11。
如果中括号中包含多条命令,那么会以最后一条命令的返回值作为整个命令置换的结果。例如:
%set a [expr 1+1; expr 2+2] #使用4替换 输出 4命令置换和变量置换都可以进行嵌套,而且嵌套深度并没有很严格的限制,因此Tcl可以借助这种机制完成比较复杂的脚本逻辑。
反斜杠置换
最后一种常见的置换方式是反斜杠置换。反斜杠\的主要作用,是把那些原本具有特殊意义的字符转义成字面意义,或者表示某些特殊字符本身。例如,空格、换行、美元符号$、中括号[]等,在Tcl中都有特殊含义;而使用反斜杠后,就可以改变它们原本的解释方式。
%set a 111\ 222 #如果不使用\转义空格,则空格会被当做参数分隔符,会报错 111 222 #下面两种形式也可以 %set a "111 222" 111 222 %set a {111 222} 111 222 #转义$ %set a \$b $b #转义换行符 %set a expr[111+\ 222] 333除了上面这些常见用法外,反斜杠还支持很多其他转义形式,如下所示:
| \a | 铃(0x7) |
| \b | 退格(0x8) |
| \f | 换页符(0xc) |
| \n | 换行符(\n) |
| \r | 回车符(0xd) |
| \t | 水平制表符(0x9) |
| \v | 垂直制表符(0xb) |
| \<newline> | 将换行符和第二行的前置空格替换为一个空格 |
| \\ | 反斜杠自身 |
| \ooo | 用1、2或3位八进制的方式指定字符的ASCII码 |
| \xhh | 用1或2位十六进制的方式指定字符的ASCII码 |
| \uhhhh | 用4位十六进制的方式指定字符的Unicode码 |
| \c | 将c转换为字面意,例如\$ |