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"
   }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值