我正在尝试比较使用if条件
xorg != "t8405" or "t9405" or "t7805" or "t8605" or "t8705"
我想比较一下,如果xorg不等于右侧的所有这些值,那么执行Y. 我想弄清楚如何才能更好地进行智能比较,或者我将xorg与逐个值进行比较? 此致
答案 0 :(得分:5)
我认为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
如果我有一组方便的数组键。我经常在实践中使用后者......