2016-07-26 38 views
-1

我正在使用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]" 

} 

回答

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] 
} 

A 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]在由字符(给定组中的单个字符匹配匹配^确实否定;一系列可以作为A-Z
  • \xX匹配的字符,即使该字符是特殊(的*?[]\之一)
+0

太好了!还有一个问题 如果我想为一个更一般的案例来处理所有的案例Wbay1,Wbay2,Wbay3 ... Wbayn 然后,而不是Wbay [12],我应该怎么做? 我希望代码能够智能地识别Waby的存在并捕获它们? 非常感谢! – Reza