TCL错误:关闭引用后的额外字符

时间:2017-08-01 07:31:59

标签: tcl tk

我正在尝试评估某种表达方式。我有“pqr”&&命令中的“xyz”。在评估命令时,它给出了一个错误:close-quote后的额外字符。 我认为tcl无法解析&&双引号后。如果这是原因那么我应该如何处理双引号和&&?

1 个答案:

答案 0 :(得分:1)

你没有给我们足够的信息。

一个疯狂的猜测是你写的是这样的东西:

expr "pqr"&& "xyz"

确实给出错误消息“close-quote后的额外字符”。这是因为解释器尝试根据Tcl语言规则解析命令,其中一个规则是以双引号开头的单词必须以匹配的双引号结束。在这种情况下,匹配的双引号后面有两个&个字符。

现在,

expr "pqr" && "xyz"

(双引号和&符号之间的空格)也不好。这是因为解释器将在准备命令的参数时删除具有语法功能的任何字符。这意味着参数expr得到的是字符串pqr && xyz。执行expr命令时,它会尝试将其参数解释为不是 Tcl的特殊表达式语言中的字符串。特别是,与不是布尔值的Tcl字符串不同,或者函数变量的名称必须始终用大括号或双引号括起来,如下所示:"pqr" && "xyz"。那你怎么做到的?你总是将论据括起来expr,就是这样。

expr {"pqr" && "xyz"}

表示expr获取合法字符串"pqr" && "xyz"

但是字符串"pqr" && "xyz"仍然无效,因为没有为字符串以外的字符串定义&&(逻辑和)操作,而字符串等于布尔值的字符串表示形式,例如expr {"true" && "false"}

所以,我们再次陷入困境,因为你似乎想要做的事情毫无意义。如果你告诉我们你在做什么,我们可能会帮助你。

*)除非你不应该。罕见,专家级。

文档: exprMathematical operators as Tcl commandsSummary of Tcl language syntax

支持你的表达

expr命令(以及扩展名为forifwhile的命令,它们使用相同的机制来评估其条件)解释表达式字符串这是从其参数构造的。请注意,表达式字符串的语言不是Tcl,而是特定于expr命令的表达式求值程序:语言共享许多语法形式,但与{{1}的基于运算符的中缀结构根本不同语言和前缀,Tcl的基于命令的结构。

让Tcl解释器在将参数传递给expr之前评估参数可以导致

  1. 双重替换,其安全问题类似于SQL注入攻击。
  2. 迭代命令(exprfor)获取常量值条件参数,导致无限循环。
  3. 所有替换(以及因此它们的副作用)总是发生,而while可以选择性地抑制它们中的一些。
  4. 因此,将表达式字符串作为支撑(转义)字符串提供几乎总是更好,它将由Tcl解释器评估,只有expr解释器。< / p>

    请注意,虽然expr的无括号参数只要参数评估将它们转换为有效表达式,但允许它是无效的表达式字符串,但是支持的表达式必须是有效的(例如变量或命令替换必须是简单的操作数而不是运算符或复杂的表达式。)

    使用支撑表达式字符串的另一个好处是字节编译器通常可以从它们生成更高效的代码(快5到10倍)。