TCL提出了一般代码

时间:2016-07-26 01:03:47

标签: tcl

我正在使用tcl。下面是我到目前为止的代码;有更好的方法吗?

if {$parname == "Wbay1" || $parname == "Wbay2" } {
    set  count  [string index $parname end]
    set Wbay$count  [lindex $elem 1]
    puts "set Wbay$count  [lindex $elem 1]"
} 

像这样更加一般

if {$parname == "Wbay*" } {
    set  count  [string index $parname end]
    set Wbay$count  [lindex $elem 1]
    puts "set Wbay$count  [lindex $elem 1]"

}

1 个答案:

答案 0 :(得分:3)

如果名称为Wbay1,...,Wbay9,则可以使用

if {[string match {Wbay[1-9]} $parname]} {
    set $parname [lindex $elem 1]
}

如果数字部分可以大于9,则应使用

if {[regexp {Wbay\d+} $parname]} {
    set $parname [lindex $elem 1]
}

regexp(正则表达式)匹配比字符串匹配更强大。在这种情况下,\d+表示“一个或多个数字”。

如果您想记录到目前为止看到的最高数字,请使用

set maxN 0
...
if {[regexp {Wbay(\d+)} $parname -> n]} {
    set maxN [expr {max($n, $maxN)}]
    set $parname [lindex $elem 1]
}

括号表示您要捕获匹配的字符串,即数字。 ->符号是变量名称:当我们不关心它时,它是一种常用于存储完整匹配(例如“Wbay7”)的约定。变量n设置为捕获的数字。如果regexp未返回1,则n中的值不可信:变量将保留之前的值。变量maxN设置为$n$maxN中最大的一个。

但是你也可能会发现数组变量很有用。使用数组,您可以为单个成员Wbay(1)Wbay(2)Wbay(99)等命名(它们不必是连续的或按顺序)。如果您想知道自己拥有多少会员,array size Wbay会告诉您。

文档: arrayexpriflindexmax (function)regexpsetstringSyntax of Tcl regular expressions

Tcl字符串匹配的语法:

  • *匹配零个或多个字符的序列
  • ?匹配单个字符
  • [chars]匹配字符给出的集合中的单个字符(^ 否定;范围可以 az
  • \x匹配字符 x ,即使该字符是特殊字符(*?[]\之一)