我在试着评估某些表达方式。我有"pqr“&& "xyz”的命令。在计算命令时,它会给出一个错误:关闭引号后的额外字符。我认为tcl不能解析&&双引号。如果这就是原因,那么我应该如何处理双引号和&&?
发布于 2017-08-01 13:35:05
你没有给我们足够的信息。
一个疯狂的猜测是你写的是这样的东西:
expr "pqr"&& "xyz"这确实会给出错误消息“关闭引号后的额外字符”。这是因为解释器试图根据Tcl语言规则解析命令,其中一个规则是以双引号开头的单词必须以匹配的双引号结尾。在本例中,匹配的双引号后面有两个&字符。
现在,
expr "pqr" && "xyz"(双引号和符号之间有一个空格)也不好。这是因为在为命令准备参数时,解释器将删除具有语法功能的所有字符。这意味着expr获取的参数是字符串pqr && xyz。当执行expr命令时,它尝试用一种非Tcl的特殊表达式语言将其参数解释为字符串。特别是,与Tcl中不属于布尔值或函数变量名称的字符串不同,函数的名称必须始终用大括号或双引号括起来,如:"pqr" && "xyz"。那你是怎么弄到的?您总是*支持expr的论点,这就是为什么。
expr {"pqr" && "xyz"}意味着expr获得合法字符串"pqr" && "xyz"。
但是字符串"pqr" && "xyz"仍然无效,因为&& (逻辑和)操作不是为字符串定义的,字符串等于布尔值的字符串表示形式,比如expr {"true" && "false"}
所以,我们又被困住了,因为你似乎想做的事是没有意义的。如果你告诉我们你在做什么,我们也许能帮你。
*)除非你不应该。罕见的,专家级的。
文档:expr,数学运算符作为Tcl命令,Tcl语言语法概述
支撑你的表情
expr命令(以及扩展到命令for、if和while,它们使用相同的机制计算它们的条件)解释由其参数构造的表达式字符串。请注意,表达式字符串的语言不是Tcl,而是特定于expr命令的表达式计算器:这些语言共享许多语法形式,但与expr语言的infix、基于操作符的结构和用于Tcl的前缀、基于命令的结构有根本的不同。
让Tcl解释器在将参数传递给expr之前对它们进行评估,可能会导致
for,while)获得常值条件参数,导致无限循环.expr可以选择性地抑制其中的一些。因此,将表达式字符串作为带括号(转义)的字符串提供几乎总是更好的做法,它不会由Tcl解释器(只有expr解释器)计算。
注意,虽然expr的未大括号参数被允许为无效的表达式字符串,只要参数计算将它们转换为有效的表达式,大括号的表达式必须是有效的(例如变量或命令替换必须是简单操作数,而不是运算符或复杂表达式)。
使用带大括号的表达式字符串的另一个好处是,字节编译器通常可以从它们生成更高效的代码(5-10倍的速度)。
https://stackoverflow.com/questions/45431582
复制相似问题