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

TCL错误:关闭引号后额外字符,tcl,tk,Tcl,Tk,我正在尝试评估某个表达式。我有“pqr”和“xyz”在指挥。在计算命令时,它给出了一个错误:关闭引号后有额外的字符。 我认为tcl无法在双引号后解析&&after。如果这是原因,那么我应该如何处理双引号和&?您没有给我们提供足够的信息 一个疯狂的猜测是你写了这样的东西: expr "pqr"&& "xyz" 这会给出错误消息“关闭引号后的额外字符”。这是因为解释器试图根据Tcl语言规则解析命令,其中一个规则是以双引号开头的单词必须以匹配的双引号结尾。在本例中,匹配的双引号后面有

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

您没有给我们提供足够的信息

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

expr "pqr"&& "xyz"
这会给出错误消息“关闭引号后的额外字符”。这是因为解释器试图根据Tcl语言规则解析命令,其中一个规则是以双引号开头的单词必须以匹配的双引号结尾。在本例中,匹配的双引号后面有两个
字符

现在,

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

expr {"pqr" && "xyz"}
表示
expr
获取合法字符串
“pqr”和&“xyz”

但是字符串
“pqr”和&“xyz”
仍然无效,因为除了与布尔值的字符串表示形式相同的字符串(例如
expr{“true”和“false”)之外,没有为字符串定义
&
(逻辑and)操作

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

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

文件: , ,

振作起来

该命令(以及扩展为
for
if
while
的命令,它们使用相同的机制来评估它们的条件)解释由其参数构造的表达式字符串。请注意,表达式字符串的语言不是Tcl,而是特定于
expr
命令的表达式计算器:这些语言共享许多语法形式,但与
expr
语言的中缀、基于运算符的结构和Tcl的前缀、基于命令的结构有根本不同

在将参数传递给
expr
之前,让Tcl解释器评估这些参数可能会导致

  • 双重替换,具有类似于SQL注入攻击的安全问题
  • 迭代命令(
    for
    while
    )获取常量值条件参数,导致无限循环
  • expr
    可以选择性地抑制某些替代时,所有替代(及其副作用)总是发生
  • 因此,几乎总是最好将表达式字符串作为大括号(转义)字符串提供,Tcl解释器不会对其求值,而只对
    expr
    解释器求值

    请注意,
    expr
    的无支撑参数可以是无效的表达式字符串,只要参数计算将其转换为有效的参数,带括号的表达式必须是有效的(例如,变量或命令替换必须是简单操作数,而不是运算符或复杂表达式)


    使用大括号表达式字符串的另一个好处是字节编译器通常可以从中生成效率更高的代码(快5-10倍)。

    您没有给我们提供足够的信息

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

    expr "pqr"&& "xyz"
    
    这会给出错误消息“关闭引号后的额外字符”。这是因为解释器试图根据Tcl语言规则解析命令,其中一个规则是以双引号开头的单词必须以匹配的双引号结尾。在本例中,匹配的双引号后面有两个
    字符

    现在,

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

    expr {"pqr" && "xyz"}
    
    表示
    expr
    获取合法字符串
    “pqr”和&“xyz”

    但是字符串
    “pqr”和&“xyz”
    仍然无效,因为除了与布尔值的字符串表示形式相同的字符串(例如
    expr{“true”和“false”)之外,没有为字符串定义
    &
    (逻辑and)操作

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

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

    文件: , ,

    振作起来

    该命令(以及扩展为
    for
    if
    while
    的命令,它们使用相同的机制来评估它们的条件)解释为