任何人都可以帮我比较tcl中的两个字母数字值。
如果说我有两个版本的值
set val1 "2.1.a"
set val2 "1.2.a"
如果我想获得两个值的最大值,即$ val1(如上例所示),我该怎么做?
除了通过角色比较进行角色之外还有什么方法吗?
可能的一组值:
1.0
1.1a
1.2.3f
2.1
提前致谢。
答案 0 :(得分:3)
我会将版本字符串分解为一个列表,逐个比较它们:
# Breaks the version string into a list of tokens
proc tokenize {v} {
set v [string map { " " "" } $v]
set result {}
foreach token [split $v ".-"] {
set tokens_scanned [scan $token "%d%s" number alpha]
if {$tokens_scanned == 0} {lappend result $token} ;# is alpha, e.g. beta
if {$tokens_scanned == 1} {lappend result $number} ;# is number, e.g. 5
if {$tokens_scanned == 2} {lappend result $number $alpha} ;# is both, e.g. 5beta
}
return $result
}
# Examples of versions this function handles:
# 1, 1a, 1.5, 3.2b, 3.2.1, 3.2.1-beta1
proc compare_version {v1 v2} {
# Sanitize the data
set v1 [tokenize $v1]
set v2 [tokenize $v2]
foreach token1 $v1 token2 $v2 {
if {$token1 < $token2} { return -1 }
if {$token1 > $token2} { return 1 }
}
return 0
}
答案 1 :(得分:2)
尝试执行以下操作:
set val1 "2.1.a"
puts $val1
set val2 "1.2.a"
puts $val2
puts [string compare $val2 $val1]
它执行字符串string1和string2的逐字符比较。返回-1,0或1,具体取决于string1是否按字典顺序小于,等于或大于string2
浏览this link了解更多详情; 希望它能解决你的问题。
答案 2 :(得分:0)
根据Tcl文档,要比较tcl中的两个版本号,您应该使用package命令:
package vcompare version1 version2
比较版本1和版本2给出的两个版本号。如果version1是比version2早的版本,则返回-1;如果相等,则返回0;如果version1早于version2,则返回1。