我试图比较使用if条件
xorg != "t8405" or "t9405" or "t7805" or "t8605" or "t8705"
我想比较一下,如果xorg不等于右侧的所有这些值,那么执行Y.我试图找出如何更好地进行智能比较或shell我将xorg与逐个值进行比较?问候
我认为in
和ni
(n ot i n)运算符是你应该看的.他们测试列表的成员资格(或非成员资格).在这种情况下:
if {$xorg ni {"t8405" "t9405" "t7805" "t8605" "t8705"}} { puts "it wasn't in there!" }
如果你有很多这些东西并经常测试,那么你最好把这些值放入数组的键中并使用info exists
:
foreach key {"t8405" "t9405" "t7805" "t8605" "t8705"} { set ary($key) 1 } if {![info exists ary($xorg)]} { puts "it wasn't in there!" }
这样做需要更多的设置,但是之后每次测试实际上更快(特别是从8.5开始).加速是因为数组是使用快速哈希表在内部实现的; 哈希查找比线性表扫描更快.您也可以使用词典(大约dict set
代替set
而dict exists
不是代替info exists
)但速度相似.
最后一个选项是使用,lsearch -sorted
如果您按顺序放置该列表,因为它从线性扫描切换到二进制搜索.这也可能非常快,并且可能没有设置成本(如果您将列表存储在第一位),但这是我的经验中最不明确的选项.(in
操作员在内部使用非常简化lsearch
,但只是在线性扫描模式.)
# Note; I've pre-sorted this list set items {"t7805" "t8405" "t8605" "t8705" "t9405"} if {[lsearch -sorted -exact $items $xorg] < 0} { puts "it wasn't in there!" }
我通常使用成员运算符(因为它们很容易)或者info exists
我有一组方便的数组键.我经常在实践中使用后者......