相关阅读
Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm=1001.2014.3001.5482
变量
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默认把所有的表达式当做字符串而不会计算,所以b的值被设定为字符串"10+1"。如果需要进行表达式计算,需要使用其他命令,这就引出了下面会谈到的命令置换。
命令置换
命令置换可以使命令的返回值成为另一个命令的参数,只需要使用中括号[]包围需要置换的命令即可。如第一章所说的一样,在一个命令处理自己的参数前,它会完成参数中所有的置换,例如:
% 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
命令置换和变量置换可以任意深度嵌套,从而搭配完成复杂的工作。
反斜杠置换
最后一种置换是反斜杠置换,它被用来将那些有特殊意义的字符转义为字面意思。比如变量替换前缀$、大括号{}、中括号[]、空格、换行符等。例如:
%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转换为字面意,例如\$ |