TCL中的变量和命令替换
我对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“这是一个大括号
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变得非常强大: