A-A+

TCL中switch流程控制命令的匹配模式

2020年05月17日 脚本 阅读 1,260 views 次

在TCL中switch命令用一个值与很多模式比较,执行能匹配的那个模式所对应的TCL脚本。switch命令有两种形式,第一种结构类似如下形式:

switch $x {a {incr t1} b {incr t2} c {incrt3}}

第一个参数是要检测的值(这个示例中就是变量x的内容)。第二个参数是包含一个或多个元素对的列表。每一对的第一个元素是要与检测值进行比较的模式,第二个元素是如果模式匹配将执行的脚本。switch命令顺序处理这些元素对,用它们的模式和检测值进行比较。一旦找到一个匹配,它就执行相应的脚本,将脚本的值作为它的值返回。如果没有匹配的模式,就不执行脚本, switch返回一个空字符串。在上述示例命令中,如果x的值为a,t1加1;如果x为b,加t2;如果x为c,加t3;其他情况下什么也不做。

第二种形式将模式和脚本作为独立的变量传入,而不是把它们先组成一个列表。例如:

switch $x a {incr t1} b {incr t2} c {incrt3}

这种形式的优势在于,想对模式参数调用替换更加容易。但是第一种形式更有利于书写,可以很方便地把模式和对应的脚本写成多行格式,例如

switch $x {

a {incr t1}

b {incr t2}

c {incr t3}

}

最外层的大括号避免了换行符被作为命令分隔符处理。而第二种形式就必须用反斜线来达到相同的效果,例如:

switch $x \

a {incr t1} \

b {incr t2} \

c {incr t3}

switch命令支持三种模式匹配方式。可以在给出检测值之前指定选项,选择需要的方式: -exact表示严格的字符串比较;-glob表示string match命令下的匹配(详见string match命令);-regexp使用正则表达式匹配。默认是-exact。对于正则表达式匹配,还可以指定 matchvar参数,在它后面跟一个变量名。switch命令会在这个变量中存入一个列表。第一个元素是与整个正则表达式匹配的字符串:第二个元素由与首先捕获到的子模式匹配的字符组成;以此类推。如果没有与正则表达式匹配的字符,匹配变量matchvar后面那个参数的值就是一个空列表。-indexer选项与-matchvar相似,但存入的不是匹配的字符,这个索引变量会接收到有关字符索引的一个列表,其中的索引指向匹配的子字符串。索引变量列表的第一个元素是有两个元素的一个子列表,索引指向匹配正则表达式的子字符串的开头和结尾字符;第一个元素中的两个索引指向匹配首先捕获到的子模式的子字符串的开头和结尾字符,以此类推。

如果检测值从-符号开始, switch命令可能会把它误认为选项导致错误,所以,通常情况下,应该总是使用--选项来标记选项的结束,确保switch命令在任何情况下都能正确地识别检测字符串。

如果 switch命令的最后一个模式是default,那么它可以与任意值匹配,因此 switch在其他的模式都无法匹配时就会执行default对应的脚本。例如下面这个示例脚本,它检测一个列表,进行三个计数。第一个t1,计列表中包含a的元素的个数;第二个t2,计列表中为无符号十进制整数的元素的个数;第三个t3,计所有其他元素的个数。

set t1 0

set t2 0

set t3 0

foreach I $x {

switch –regexp -- $i {

    a      {incr t1}

    ^[0-9]+$ {incr t2}

    default {incr t3}

}

}

如果switch命令的某个脚本是-,那么 switch会使用下一个模式对应的脚本。在多个模式对应相同的脚本的时候,这可以使脚本更加简洁,例如:

switch -- $x {

a –

b –

c {incr t1}

d {incr t2}

}

这个脚本在x是a、b或c时将t1加1,在x是d时将t2加1。

注意,switch语句中不能在中间添加注释,只能把注释加在脚本部分。例如:

switch $x {

#此处加注释会产生错误

a {

#此处可以添加注释

… …

}

b {

… …

}

}

个人公众号“数字化设计CAX联盟”,欢迎关注,共同交流
标签:
为您推荐:

给我留言

© 坐倚北风 版权所有 严禁镜像复制 苏ICP备15034888号. 基于 Ality 主题定制 AliCMS
联系邮箱:leanwind@163.con,微信公众号:数字化设计CAX联盟

用户登录

分享到: