嵌套{}和[]之间的区别

时间:2013-01-05 08:17:50

标签: tcl

为什么在大括号引号中,你必须逃避所有大括号(不应该在嵌套中计算),但在括号替换中,你不必全部逃避括号(不应计入嵌套)。

puts "}" ;# ok in top-level (1)
if {1} {puts "}"} ;# but not ok when inside a brace quote (2)

puts {]} ;# ok in top-level (3)
set output [puts {]}] ;# and still ok inside a bracket substitution (4)

1 个答案:

答案 0 :(得分:4)

当解释器在单词的开头遇到{时,它会查找匹配的}来获取单词(要执行的命令名称或发送到命令的其中一个参数)

但是当翻译遇到未转义的[时,它不会查找匹配的]。它停止解析脚本本身并递归调用另一个解释器。该解释器开始解析[之后的字符。当它在示例4中找到{时,它会开始引用模式,因此]被视为普通字符。

那么为什么不在遇到{时递归调用解释器,并摆脱示例2中的大括号问题?因为你用大括号引用的单词并不总是一个脚本,即使它是,它可能不应该马上运行。大括号引用必须准确;解析器不能根据它们是否在"[]等内部来区别对待,就像脚本解析器一样。