2017-01-19 3 views
1

Я пытаюсь сравнить с помощью, если условиеКак сравнить условия с несколькими значениями в TCL

xorg != "t8405" or "t9405" or "t7805" or "t8605" or "t8705" 

Я хочу сравнить, если Xorg не равно все эти значения на правой стороне затем выполнить Y. Я пытаюсь понять, как лучше иметь более умное сравнение или оболочку сравнивать Xorg с одним значением? С уважением

ответ

5

Я думаю in и ni (п ВЗ я п) операторы, что вы должны смотреть. Они проверяют членство (или не членство) в списке. В этом случае:

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, если у меня есть удобный набор ключей массива. Я часто использую последнее на практике ...

+0

'in' /' ni' делать сравнение с каждым элементом, но проще. Остальные два намного быстрее для больших коллекций, но нуждаются в дополнительной настройке для работы. ('lsort' может помочь с настройкой списка для' lsearch -sorted'.) –

Смежные вопросы