Вы можете переписать его как конструкцию ififif else, как уже сказал Брайан Фентон (и упростить ее с помощью оператора 'in'.
if {$myvar in $list1} {
puts "myvar matches content of list"
} elseif {$myvar in $list2} {
puts "myvar matches content of list2"
} elseif {
puts "myvar doesn't match any content of any list"
}
Конечно, вы можете свернуть код и написать свою собственную версию коммутатора, которая делает то, что вы хотите, в конце концов, это Tcl ...
proc listswitch {item conditions} {
if {[llength $conditions] % 2} {
return -code error "Conditions must be pairs"
}
set code ""
foreach {cond block} $conditions {
if {$cond eq "default"} {
set code $block
break
} elseif {$item in $cond} {
set code $block
break
}
}
if {$code ne ""} {
uplevel 1 $code
}
}
listswitch 10 {
{10 20 30 50} {
puts "Match in list 1" }
{50 20 90 11} {
puts "Match in list 2"
}
default {
puts "No match"
}
}
Вам нужно немного беспокоиться, если вы хотите буквально сопоставлять имена файлов или какое равенство вас интересует. Там есть некоторые тонкие вещи, такие как нечувствительные к регистру файловые системы, различные разделители каталогов, абсолютные и относительные и даже такие вещи, как кодировки файловой системы, которые могут изменить результат.