使用运算符eq的TCL命令expr背后的魔力是什么?

时间:2016-08-24 08:13:51

标签: tcl

我想了解用于字符串比较的TCL命令expr:

我尝试了以下内容:

expr {t eq t}
=> 1
expr {tru eq tr}
=> 0
expr {tru eq truee}
=> invalid bareword "truee" ...
expr {a eq a}
=> invalid bareword "a" ...

单词t,tr,tru背后的魔力是什么? Tcl是否特别处理这些字符串?我知道如果我使用expr和eq,我必须引用字符串,但是我有一些使用这种比较形式的遗留程序。我想了解它。感谢。

1 个答案:

答案 0 :(得分:7)

Tcleqne进行字符串比较,而==进行数字比较。

% expr {1 == 1.0}
1
% expr {1 eq 1.0}
0
%

每当您使用eq并且输入非数字时,它应该与双引号或变量引用一起使用。 您无法使用文字裸字字符串表示法。

例如

% expr {"a" eq "b"}; # Strings with double quotes
0
% set i a
a
% expr {$i eq "a"}; # String with variable reference
1
% expr {a eq b}; # Literally using the string as bareword
invalid bareword "a"
in expression "a eq b";
should be "$a" or "{a}" or "a(...)" or ...
%

此规则中有一个例外,其中Tcl布尔值起作用。

Tcl中,正确的布尔值是一个正确的整数,如C中所示,0表示为false,非零表示为true,或者是以下之一:

yes, true, on   --> Boolean 1
no, false, off  --> Boolean 0

当它们被部分使用时,Tcl倾向于与任何已知项目匹配,并且相应地进行评估。

如果您使用这些特殊字词评估expr,那么它将返回相同的内容。

% expr {true}
true
% expr {false}
false
% expr {t}; # Tcl automatically matches internally and map it to 'true'
t
% expr {fa} ; # Similary, mapped to 'false'
fa
% expr {o} ; # Will throw error as it is conflicting with 'on' & 'off'
invalid bareword "o"
in expression "o";
should be "$o" or "{o}" or "o(...)" or ...
% expr {on}
on
% expr {of}; # Matching 'off' boolean 
of

% if true {puts ya}
ya
% if n {puts ya}; # Matching boolean 'no'
% if f {puts ya}; # Matching boolean 'false'
% if false {puts ya}
% if yes {puts ya}
ya
% if y {puts ya}; # Matching boolean 'y'
ya

所以,如果你的输入是用布尔值映射的,它们仍然有效,但只被视为字符串。

现在,让我们回到你原来的问题。

% expr {t eq t}; # Tcl mapped the 'true' boolean and string-wise both are same. So, returned 1
1
% expr {tru eq tr}; # Both mapped 'true'. But, string-wise differs. So, returned 0
% expr {tru eq truee}; # 'tru' mapped to 'true' and 'truee' is unknown. So error
invalid bareword "truee"
% expr {a eq a}; # Both are used literally, so error throw.
invalid bareword "a"

现在,你的评论中的问题,

% expr {yes == true}; # String-wise, both are different. So, returned 0
0