tcl/tk參考——控制結構switch
阿新 • • 發佈:2019-01-01
.
.
名稱
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命令就返回一個空字串。
如果變元以-
- 嚴格匹配string和pattern,預設。
- -glob
- 使用通配風格進行模式匹配。
- 使用正則表示式進行模式匹配。
- 忽略大小寫進行匹配。
- 只有同時指定了-regexp的時候才有效果,這個可選項指定了一個變數的名字,這個變數為一個列表。當正則表示式匹配後,這個列表的第一個元素被設定為匹配的字串,第二個元素為匹配的子模式字串,以此類推。如果匹配了default,這個變數就被置為空字串,這個可選項可以同時指定-indexvar。
- 只有同時指定了-regexp的時候才有效果,這個可選項指定了一個變數名,這個變數為一個列表,當正則表示式匹配後,這個列表的第一個元素被設定成為兩個元素的列表,指明瞭匹配字串的開始的索引和不匹配後的第一個字元索引(比如匹配了0-3索引的字元,那麼這個值就是4,也就是第一個不匹配的字元),與regexp
- --
- 表示可選項結束。
pattern和body變元有兩種語法,第一種在每個模式和命令中使用一個獨立的變元,這種格式在替換髮生在一些模式和命令當中是方便的,第二種格式將所有的模式和命令都放到一個單獨的變元中,這個變元必須是一個合法的列表結構,第二種格式使使用多行的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"
}
}