如何使测试条件在TCL中工作

Rat*_*dey 1 string tcl

% set HI 1
1
% if { [ info exists HI] && { $HI == 1 } } { puts "Hello World "}
can't use non-numeric string as operand of "&&"
%   
Run Code Online (Sandbox Code Playgroud)

这两种情况都可以单独测试.如何使测试的&&在TCL中起作用?

仅此一点起作用

% if  { $HI == 1 }  { puts "Hello World "}
Hello World
Run Code Online (Sandbox Code Playgroud)

这也是独一无二的.

% if { [ info exists HI]  } { puts "Hello World "}
Hello World
Run Code Online (Sandbox Code Playgroud)

And*_*ong 5

你不需要额外的花括号; 这应该工作正常:

if { [info exists HI] && $HI == 1 } { puts "Hello World" }
Run Code Online (Sandbox Code Playgroud)


Mar*_*nte 5

测试的第二部分,即

{ $HI == 1 }
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为我认为你对Tcl中括号的含义感到困惑.大括号相同( ... ),它们不能用于数学表达式来改变评估中使用的优先级.

大括号用于组成包含空格的字符串,并使其显示为Tcl命令的单个参数,但不在其中执行替换.

在您的情况下,$HI它不会被HI变量的值替换,因此您将形成一个字符串,其中包含您在大括号内看到的所有确切字符,包括前导和尾随空格.

如果你这样做

if {{ $HI == 1 } eq {$HI == 1}} {
    puts "same"
} else {
    puts "not the same"
}
Run Code Online (Sandbox Code Playgroud)

你会得到not the same结果.(eq在表达式中执行字符串比较.)

如果你使用双引号字符作为字符串分隔符,那么你也不会得到正确的意思

" $HI == 1 "
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你的变量实际上是用它的值代替的,所以就像你直接写的那样(假设$HI1,就像你的代码一样):

" 1 == 1 "
Run Code Online (Sandbox Code Playgroud)

但它的字符串,再次.

为什么Tcl抱怨?因为它说,你要使用一个非数字字符串作为操作数&&,并且{ $HI == 1 }不是数字,因为没有办法看到的是一个数字,这样的Tcl不能转换到依赖于数字真/假值(如果为0则为false,如果不为0则为true,并且发生错误.

我想你真正想写的是

if { [ info exists HI] && ( $HI == 1 ) } { puts "Hello World "}
#                         ^          ^
#                         |__________|____ note ( ) instead of { }
Run Code Online (Sandbox Code Playgroud)

给予更高的优先级的==关于&&,或使条件更加清晰.expr,在a的测试条件中隐式调用if,知道圆括号与您在其他编程语言和数学中找到的含义相同:更改评估顺序.

正如在其他答案和评论中已经指出的那样,你真的不需要括号,因为(如在C和许多其他语言中),等于运算符==的优先级高于布尔值和&&.但如果你愿意,你可以( ... )毫无顾虑地使用:

if {2 - 1 * 2} { puts yes } { puts no }
Run Code Online (Sandbox Code Playgroud)

给出no,因为表达式被计算为2 - (1 * 2)0.

if {(2 - 1) * 2} { puts yes } { puts no }
Run Code Online (Sandbox Code Playgroud)

给人yes因为(2 - 1) * 2是2.

  • 严格地说,如果两个参数都是数字,则`==`执行数字相等,否则执行字符串相等.`eq`跳过"是这些数字"位并直接进入字符串相等. (2认同)