tcl中两个字母数字值的比较

时间:2013-02-01 06:09:09

标签: tcl

任何人都可以帮我比较tcl中的两个字母数字值。

如果说我有两个版本的值

set val1 "2.1.a"
set val2 "1.2.a"

如果我想获得两个值的最大值,即$ val1(如上例所示),我该怎么做?

除了通过角色比较进行角色之外还有什么方法吗?

可能的一组值:

1.0
1.1a
1.2.3f
2.1

提前致谢。

3 个答案:

答案 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。