我正在使用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]"
}
答案 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
会告诉您。
文档: array, expr, if, lindex, max (function), regexp, set, string, Syntax of Tcl regular expressions
Tcl字符串匹配的语法:
*
匹配零个或多个字符的序列?
匹配单个字符[chars]
匹配字符给出的集合中的单个字符(^ 不否定;范围可以 az )\x
匹配字符 x ,即使该字符是特殊字符(*?[]\
之一)