他のelseifは、ブライアン・フェントンがすでに言ったように、簡単に構築(とあまりにも「内の」演算子とそれを簡略化する場合は、としてそれを書き換えることができます。
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"
}
}
あなたは文字通り、ファイル名を一致させたい場合は少し心配する必要はあり、またはどのような平等のあなたしかし興味がある。大文字と小文字を区別しないファイルシステム、別のディレクトリ区切り文字、絶対値と相対値、さらには結果を変えるかもしれないファイルシステムエンコーディングのようなものもあります。
ありがとう!私は比較の問題についてあまり心配するつもりはない。それは私が必要とする非常に簡単なチェックの最後にあります。しかし、私は、ネストされたif-elsesがこの問題をカバーすべきだと思います。 このリスト比較スイッチの個人用バージョンを作成することから得られる利点の1つは、いくつかの作業で、入力リスト(mylist1とmylist2だけでなく)の可変量を受け入れるようにできることです。おそらくいくつかのループがあります。 ifs-elsesは、入力量の変更があれば変更する必要があります。 – JasonBourne
+1素晴らしい答えです。 – TrojanName
私は 'uplevel'をループの外側に置いて、呼び出し元のスクリプト内の' break'や 'continue'が消費されないようにしました。しかしそれは素晴らしい解決策です。 –