TCL中的变量和命令替换

TCL中的变量和命令替换,tcl,Tcl,我对TCL中的替代有点困惑。考虑下面的代码: set z [set x "This is a string within quotes within braces"] puts $z set z {[set x "This is a string within quotes within braces"]} puts $z 上面的代码将给出结果这是一个大括号内引号内的字符串 考虑到变量z设置为字符串“这是大括号内引号内的字符串” 至于第二个命令,在替换之后,它应该类似于put“这是一个大括号

我对TCL中的替代有点困惑。考虑下面的代码:

set z [set x "This is a string within quotes within braces"]
puts $z
set z {[set x "This is a string within quotes within braces"]}
puts $z
上面的代码将给出结果
这是一个大括号内引号内的字符串

考虑到变量z设置为字符串
“这是大括号内引号内的字符串”

至于第二个命令,在替换之后,它应该类似于
put“这是一个大括号内引号内的字符串”


但是,请检查以下代码:

set z [set x "This is a string within quotes within braces"]
puts $z
set z {[set x "This is a string within quotes within braces"]}
puts $z
现在结果是
[set x“这是大括号内引号内的字符串”]
。我不太明白这个结果

我知道所有用大括号括起来的东西都没有替代品。因此变量z现在应该包含值
[set x“这是一个大括号内引号内的字符串”]

但是对于下一行:
放置$z
,我认为,
$z
应该替换为它的值
[set x“这是大括号内引号内的字符串”]
,命令现在看起来像

puts [set x "This is a string within quotes within braces"]
为什么不直接打印
这是一个大括号内引号内的字符串?

请参见-规则11规定,Tcl中的替换只执行一次,不像Unix shell那样不断递归替换。

从变量(或命令)检索的字符串内容Tcl语言核心不会重新解释替换;他们只是接到你呼叫的命令。某些命令会重新解释其参数(例如,
eval
subst
),但
put
不会:它只是将值输出到其目标通道(默认情况下为标准输出)。执行重新解释的命令被记录下来以执行此操作



当解析
放入$z
时,Tcl首先逐个字符查看第一个单词。它在那里找不到任何Tcl元字符,因此它得到一个简单的文本,
put
。然后它看第二个单词,看到一个Tcl变量替换元字符,后跟一个字母,这是一个正确的变量替换;
$z
被从变量中读取的字符所替换,即被替换,但输入文本中的这些字符现在已被解析,因此无需更多操作

大括号防止发生替换。您是否尝试过
put{$z}
put{[set x”这是大括号内引号内的字符串]
?例如
put{$z}
put{[set x”这是大括号内引号内的字符串]
。这两方面的结果是明确的。让我感到困惑的是,变量z被设置为
[set x“这是大括号内引号内的字符串”]
,因此在替换之后,
put$z
现在看起来应该像
put[set x“这是大括号内引号内的字符串”]
。但我现在明白了。在第一次替换之后,它将不再被替换。Tcl是一种非常简单的语言。所有语法仅包含在12条规则中。花点时间想想,Tcl变得非常强大: