TCL中的变量和命令替换

时间:2018-10-09 21:35:28

标签: tcl

我对TCL中的替换有些困惑。考虑以下代码:

set z [set x "This is a string within quotes within braces"]
puts $z

上面的代码将给出结果This is a string within quotes within braces

考虑变量 z 设置为字符串"This is a string within quotes within braces"

,这一部分很清楚

对于第二个命令,替换后应该像puts "This is a string within quotes within braces"


但是,请检查以下代码:

set z {[set x "This is a string within quotes within braces"]}
puts $z

现在结果为[set x "This is a string within quotes within braces"]。我在这里不太了解这个结果。

我知道所有用花括号括起来的东西都不能替代。因此,变量 z 现在应包含值[set x "This is a string within quotes within braces"]

但是对于下一行:puts $z,我认为应该将$z替换为其值[set x "This is a string within quotes within braces"],命令现在看起来像

puts [set x "This is a string within quotes within braces"]

为什么不只打印This is a string within quotes within braces

2 个答案:

答案 0 :(得分:3)

请参见https://www.tcl.tk/man/tcl/TclCmd/Tcl.htm#M31-规则11指定Tcl中的替换仅执行一次,这与Unix shell不断进行替换的情况不同。

答案 1 :(得分:2)

Tp语言核心不会重新解释从变量(或命令)替换中检索的字符串的

内容。他们只是得到您正在调用的命令。某些命令会重新解释其参数(例如evalsubst),但是puts不会:仅将值输出到其目标通道(默认情况下为标准输出)。记录了执行重新解释的命令。


在解析puts $z时,Tcl通过逐字符查看第一个单词开始。它在那里找不到任何Tcl元字符,因此它得到一个简单的文字puts。然后,它查看第二个单词,并看到一个Tcl变量替换元字符,后跟一个字母,这是一个适当的变量替换; $z替换-即被替换为-从变量中读取的字符,但是现在解析了输入文本中的那些字符,因此无需执行其他操作。