tcl/tk參考——控制結構switch

.

.

 

名稱

switch - 根據表達式的不同執行多個分支命令中的一個

語法

switch ?options? string pattern body ?pattern body ...?
switch ?options? string {pattern body ?pattern body ...?}

描述

switch命令將string變元與每個pattern變元按順序匹配,當找到一個匹配的pattern時就執行對應pattern中的body變元,如果最後的pattern變元爲default就匹配任何字符串。如果沒有匹配到並且default沒有給出,switch命令就返回一個空字符串。

如果變元以-開頭就是可選項,支持的可選項如下:

-exact
嚴格匹配stringpattern,默認。
-glob
使用通配風格進行模式匹配。
-regexp
使用正則表達式進行模式匹配。
-nocase
忽略大小寫進行匹配。
-matchvar varName
只有同時指定了-regexp的時候纔有效果,這個可選項指定了一個變量的名字,這個變量爲一個列表。當正則表達式匹配後,這個列表的第一個元素被設置爲匹配的字符串,第二個元素爲匹配的子模式字符串,以此類推。如果匹配了default,這個變量就被置爲空字符串,這個可選項可以同時指定-indexvar
-indexvar varName
只有同時指定了-regexp的時候纔有效果,這個可選項指定了一個變量名,這個變量爲一個列表,當正則表達式匹配後,這個列表的第一個元素被設置成爲兩個元素的列表,指明瞭匹配字符串的開始的索引和不匹配後的第一個字符索引(比如匹配了0-3索引的字符,那麼這個值就是4,也就是第一個不匹配的字符),與regexp中的-indices類似。與第一個列表元素類似,列表的第二個元素爲匹配的子模式字符串開始的索引和不匹配後的第一個字符索引,以此類推。如果匹配了default,這個變量就被置爲空字符串,這個可選項可以同時指定-matchvar
--
表示可選項結束。

patternbody變元有兩種語法,第一種在每個模式和命令中使用一個獨立的變元,這種格式在替換髮生在一些模式和命令當中是方便的,第二種格式將所有的模式和命令都放到一個單獨的變元中,這個變元必須是一個合法的列表結構,第二種格式使使用多行的switch命令非常方便,因爲使用了花括號,所以不用再每行後面使用反斜槓,因爲在花括號中,所以命令和變量的替換都不會發生,所以在很多情況下非常有用。

如果body是"-",就意味着下一個模式的body可以在這個模式中使用,這個特性在很多模式中使用相同的body

switch中進行註釋要小心點,註釋必須放在body中,不能放在pattern前面。

示例

switch命令可以匹配變量(結果爲2):

set foo "abc"
switch abc a - b {expr {1}} $foo {expr {2}} default {expr {3}}

使用通配風格匹配body(結果爲1):

switch -glob aaab {
   a*b     -
   b       {expr {1}}
   a*      {expr {2}}
   default {expr {3}}
}

當沒有匹配到時,default子句運行(必須是最後一個),示例返回結果3:

switch xyz {
   a -
   b {
      # Correct Comment Placement
      expr {1}
   }
   c {
      expr {2}
   }
   default {
      expr {3}
   }
}

當使用正則表達式匹配時,使用-matchvar可選項可以很容易的獲取詳細的匹配內容:

switch -regexp -matchvar foo -- $bar {
   a(b*)c {
      puts "Found [string length [lindex $foo 1]] 'b's"
   }
   d(e*)f(g*)h {
      puts "Found [string length [lindex $foo 1]] 'e's and/
            [string length [lindex $foo 2]] 'g's"
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章