)
相关阅读Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm1001.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 $a1 #定义b为字符串101 输出 101 #可以看到结果并不是11因为Tcl是基于字符串处理的默认不会进行表达式计算在上面代码的最后我们尝试把b的值设定为表达式101计算的结果 但Tcl默认把内容当作字符串处理并不会自动把它当成数学表达式去计算。也就是说变量置换只负责把$a替换成它的值10并不会进一步去计算101。如果想让Tcl对表达式求值就需要用到下面要介绍的命令置换。命令置换命令置换的作用是让一个命令的返回值成为另一个命令的参数。在Tcl中只需要用中括号[]把命令括起来就可以完成命令置换。这意味着在外层命令真正执行之前Tcl会先执行中括号中的命令然后把它的返回结果替换到原来的位置。% set a 11 #Tcl不会计算表达式因此结果为字符串11 输出 11 % set a [expr 11] #expr命令将后面的一个或多个参数当做可以计算的表达式 输出 2 %set a 10 输出 10 %set b [expr $a1] #首先执行expr命令并进行变量替换然后将expr命令的返回值即表达式计算的结果当做set的第二个参数 输出 11可以看到在上例中的最后我们同时使用了变量置换和命令置换其中expr的参数$a1被替换为字符串101然后expr命令执行结果为字符串11随后set命令的第二个参数被替换为字符串11因此最后b的值为字符串11。如果中括号中包含多条命令那么会以最后一条命令的返回值作为整个命令置换的结果。例如%set a [expr 11; expr 22] #使用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转换为字面意例如\$