TCL三元运算符不喜欢空字符串

TCL三元运算符不喜欢空字符串,tcl,ternary-operator,Tcl,Ternary Operator,简单的问题是,TCL给了我“表达式过早结束”,因为三元表达式的最后一个参数是空字符串。如果它是其他任何东西,那么它工作正常。我可以在这里使用空字符串吗 set y 5 set x [expr ($y > 1) ? 1 : ""] 您应该始终给expr一个用大括号括起来的完整表达式作为参数。这避免了一系列问题,包括这个问题 expr {$y > 1 ? 1 : ""} 问题是expr将其参数连接起来以获得表达式。调用concat$y>1?1:“给出了字符串“5>1?1:”,该字符串

简单的问题是,TCL给了我“表达式过早结束”,因为三元表达式的最后一个参数是空字符串。如果它是其他任何东西,那么它工作正常。我可以在这里使用空字符串吗

set y 5
set x [expr ($y > 1) ? 1 : ""]

您应该始终给
expr
一个用大括号括起来的完整表达式作为参数。这避免了一系列问题,包括这个问题

expr {$y > 1 ? 1 : ""}

问题是
expr
将其参数连接起来以获得表达式。调用
concat$y>1?1:“
给出了字符串“5>1?1:”,该字符串不能被
expr
解析,我永远也不会完全理解TCL,但这是有效的:-)@MikeKulls:永远不要说永不。与其他一些语言不同,Tcl很难习惯,因为它从不试图变得聪明。有少量的硬性规定,它们总是适用的。一旦你学会清晰地表达自己,你就会与Tcl相处得很好,你会发现用其他语言设计程序也会更容易。我不得不说,我觉得这让人困惑。例如,今天我的代码失败了
if{$x eq Tx}{doSomething}
。其他任何地方的字符串都不需要引号,文档甚至说不要使用引号。@MikeKulls:expr手册页上说“请注意,所有非数字或布尔值的文字操作数都必须用大括号或双引号引起来”(标题“操作数”)。通常Tcl语法的这个例外是必要的,因为最终(替换后)输入字符串不是Tcl源,而是基于中缀的表达式语言中的字符串。