在 Tcl 中,为什么在比较两个字符串文字时必须使用引号和花括号作为 expr 的参数?

问题描述 投票:0回答:1

我想使用 Tcl 中的

expr
命令比较两个文字字符串。正确的命令是:

expr {"string1" == "string1"}

以我的理解,Tcl 中的花括号是用来防止替换的。但比较中没有变量,因为我只比较字符串文字。另一方面,由于 Tcl 命令中单词是用空格分隔的,如果我不使用空格,则无需将数学表达式分组为单个单词。所以,我想我可以删除引号和花括号。但如果这样做我会出错。具体来说,如果我删除引号,错误是:

% expr {string1==string1}

invalid bareword "string1"

in expression "string1==string1";

should be "$string1" or "{string1}" or "string1(...)" or ...

如果我删除花括号,错误是:

% expr "string1"=="string1"

extra characters after close-quote

我不明白为什么会出现这些错误。你能为我解释一下吗?谢谢你。

arguments tcl equality string-literals expr
1个回答
0
投票

你应该(几乎)总是在

expr
表达式周围加上大括号;它们使语义足够简单,Tcl 可以提前编译表达式,从而提供非常好的速度提升。语义的锁定也使代码更加安全。

表达式的语法(如手册中所述)要求字符串位于双引号(使用 Tcl 规则替换)或大括号(未替换)中,并且始终如此。从技术上讲,布尔文字和其他一些东西有例外(例如

Inf
是一个浮点值,但在解析器中语法上不是这样),但它们都是明确已知单词的显式例外。

© www.soinside.com 2019 - 2024. All rights reserved.