Tcl解析:括号内的引号令人费解

时间:2014-08-20 13:48:00

标签: parsing tcl

这是一个人为的例子,我通过将问题简化为最简单的案例来创建它:

tcl> puts "aaa [puts \"bbb\"]"
"bbb"
aaa

首先输出"bbb"是很自然的,[ ]中的代码在外部命令之前进行评估。然而,令我困惑的是那些引号。

以下代码可以满足我的需求:

tcl> puts "aaa [puts "bbb"]"
bbb
aaa

可能我并不是唯一一个眼睛被那些未被转换的内部引号所伤害的人。我知道有括号,它们很漂亮而且它们正在很好地完成它们的工作,但是我仍然期望Tcl首先找到字符串的结尾,然后再进入它以扩展其内容。有人可以详细说明吗?

1 个答案:

答案 0 :(得分:2)

TCL联机帮助页以TCL语法的简明定义开头。摘录:

  

[4]双引号。

     
    

如果单词的第一个字符是双引号(“”“),则单词由下一个双引号字符终止...命令替换,变量替换和反斜杠替换是对字符之间的字符执行的报价如下所述。双引号不会保留为单词的一部分。

  
     

[7]命令替换。

     
    

如果单词包含一个开括号(“[”),则Tcl执行命令替换。为此,它以递归方式调用Tcl解释器,将开放括号后面的字符作为Tcl脚本处理。该脚本可能包含任意数量的命令,必须以小括号(“]”)终止。

  
     

[11]替代顺序。

     
    

每个字符由Tcl解释器处理一次,作为创建命令字的一部分...如果发生命令替换,则嵌套命令完全由对Tcl解释器的递归调用处理...

  

简而言之,TCL执行单次扫描,因此命令替换[puts \"bbb\"]将被解析,执行并在扫描外部字时通过对解释器的递归调用来替换;因此,外部翻译不会看到字符。