我想了解用于字符串比较的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,我必须引用字符串,但是我有一些使用这种比较形式的遗留程序。我想了解它。感谢。
答案 0 :(得分:7)
在Tcl
,eq
和ne
进行字符串比较,而==
进行数字比较。
% 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