我对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
?
答案 0 :(得分:3)
请参见https://www.tcl.tk/man/tcl/TclCmd/Tcl.htm#M31-规则11指定Tcl中的替换仅执行一次,这与Unix shell不断进行替换的情况不同。
答案 1 :(得分:2)
内容。他们只是得到您正在调用的命令。某些命令会重新解释其参数(例如eval
或subst
),但是puts
不会:仅将值输出到其目标通道(默认情况下为标准输出)。记录了执行重新解释的命令。
在解析puts $z
时,Tcl通过逐字符查看第一个单词开始。它在那里找不到任何Tcl元字符,因此它得到一个简单的文字puts
。然后,它查看第二个单词,并看到一个Tcl变量替换元字符,后跟一个字母,这是一个适当的变量替换; $z
被替换-即被替换为-从变量中读取的字符,但是现在解析了输入文本中的那些字符,因此无需执行其他操作。