TCL中的字符串操作符
TCL中有4个用于表达式的字符串操作符:eq、ne、in、ni.
eq和ne用来检查字符串是否相等,如果相等eq返回1,ne返回0,如果不等ne返回1,eq返回0.例如:
if {$x eq “New York”} {
…
}
要指定一个字符串操作数,必须把它放在大括号中或双引号中,或使用变量替换或命令替换。上面这个示例把整个表达式括起来是很重要的,这样表达式处理器就只替换进来x的值。考虑如下命令:
set result [expr $x eq "NewYork"]
没有那个大括号,传给expr的变量就会串接起来,结果该变量的表达式变为:
Los Angeles eq New York
表达式解析器无法解析Los(它不是数字,不是函数名,也不能解析为字符串,因为它不在引号当中),于是就会发生语法错误。
如果字符串被双引号括起来,就由表达式处理器进行引号之内的命令替换、变量替换以及反斜线替换。如果字符串被大括号括起来,就不进行这些替换。在字符串中嵌套使用大括号的效果,与在命令单词中嵌套使用的效果相同。
除了检查字符串相等还是不相等的eq和ne操作符,<、>、<=、>=、==、!=操作符都可以进行字符串比较。不过,这些操作符仅在至少有一个操作数不能解析为数值时才进行字符串比较。例如下面这段脚本:
set x 8
set y 010
expr ($x== $y)
expr进行的将是数学比较,因而其处理结果是1。
如果想要把两个看似数字的值(例如,存储在变量中的值,您并不知道那些值具体是怎么样的)作为字符串进行比较,必须使用字符串比较操作符,或是string compare这样的命令。
TCL表达式还支持两个列表操作符in和ni。如果指定字符串是列表的元素,in操作符返回1,否则返回0.如果字符串不是列表的元素,in操作符返回1,否则返回0。例如下面这段脚本,检测 Los Angeles是否是cities列表的一个元素:
If {"Los Angeles" in $cities} {
…
}
in和ni操作符在字符串和列表元素间进行严格比较,不包含子字符串和样式匹配。因此,前面这个表达式与 lsearch -exact测试是完全相同的。
if {[lsearch -exact $cities “LosAngeles"] != -1] {
…
}