2011-12-21 7 views
2

私はtclでswitchの使用に関する疑いがあります。のようなものにすることが可能だった場合、主に、私は思っていた。ここでスイッチ内の変数をリストの内容と照合する方法は?

switch myvar { 
    list1 { 
     puts "myvar matches contents of list1"; } 
    list2 { 
     puts "myvar matches contents of list2"; } 
    default { 
     puts "myvar doesn't match any content of any list"; } 
} 

を、リスト1とリスト2は、リストまたは別のファイルの名前を含む文字列の配列のいずれかになります。

非常に詳細な正規表現検索を行わなければこれも可能ですか?

ありがとうございます!

答えて

6

他の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" 
    } 
} 

あなたは文字通り、ファイル名を一致させたい場合は少し心配する必要はあり、またはどのような平等のあなたしかし興味がある。大文字と小文字を区別しないファイルシステム、別のディレクトリ区切り文字、絶対値と相対値、さらには結果を変えるかもしれないファイルシステムエンコーディングのようなものもあります。

+0

ありがとう!私は比較の問題についてあまり心配するつもりはない。それは私が必要とする非常に簡単なチェックの最後にあります。しかし、私は、ネストされたif-elsesがこの問題をカバーすべきだと思います。 このリスト比較スイッチの個人用バージョンを作成することから得られる利点の1つは、いくつかの作業で、入力リスト(mylist1とmylist2だけでなく)の可変量を受け入れるようにできることです。おそらくいくつかのループがあります。 ifs-elsesは、入力量の変更があれば変更する必要があります。 – JasonBourne

+0

+1素晴らしい答えです。 – TrojanName

+0

私は 'uplevel'をループの外側に置いて、呼び出し元のスクリプト内の' break'や 'continue'が消費されないようにしました。しかしそれは素晴らしい解決策です。 –

1

良い質問Jason。最初は、2つのリストの内容を比較する方法が必要だと思っていました。しかし、文字列がリストのメンバーであるかどうかをチェックしたいと思うと思います。私はスイッチでそれを行う簡単な方法が表示されないので、私は非常に単純に使用することですlsearch

if {[lsearch $list1 $myvar ] != -1} { 
    puts "myvar matches contents of list1"; } 
} elseif {[lsearch $list2 $myvar ] != -1} { 
    puts "myvar matches contents of list2"; } 
} else 
    puts "myvar doesn't match any content of any list"; } 
} 
+0

はい、これはあまりにも真実です。私はスイッチが比較する変数のさまざまな内容にアクセスする可能性があることを期待していました。ありがとう! – JasonBourne

関連する問題