如果期望$$a发生二次置换该如何操作呢?

描述

看一个典型的例子,如下图所示。变量x被赋值为10,变量a被赋值为字符x。之后,给变量b赋值$$a。最终变量b的值将会是$x,而不是10。

TCL

为什么b的值是$x,而不是10呢?这是因为Tcl的变量置换遵循如下两条规则:

规则1:Tcl在解析一条命令时,只从左向右解析一次,进行一轮置换,每一个字符只会被扫描一次。

规则2:每一个字符只会发生一层置换,而不会对置换后的结果再进行一次扫描置换。

根据上述规则,Tcl从左向右对命令“set b$$a”进行解析,扫描所有的字符,发现$$a时,执行变量置换,得到$x,同时只发生一层置换,不会对置换后的结果$x再进行扫描置换(否则$$a中最左侧也就是第一个$将被扫描两次,与规则1冲突,)。因此,最左侧的$并不会触发变量置换,最终变量b的值将会是$x,而不是10。

那么如果期望$$a发生二次置换该如何操作呢?

方法1:采用[set var]的方式,如下图所示。代码第6行中括号中的set命令只跟随一个参数$var,$var发生变量置换,故set $var等效于set a,而set a将返回变量a的值。本质上,$var是[set var]的缩写版本。通过代码第10行和第12行可以看出,set后面如果只有一个参数,而这个参数又是一个已经定义的变量名,那么该命令就直接返回该变量的变量值,与$var等价。

TCL

方法2:采用命令subst实现此目的,如下图所示。

TCL

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分