2

谁能帮我比较 tcl 中的两个字母数字值。

如果说我有两个版本值

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

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

除了逐个字符比较之外还有什么办法吗?

可能的一组值:

1.0
1.1a
1.2.3f
2.1

提前致谢。

4

3 回答 3

3

尝试如下操作:

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

通过此链接了解更多详情;希望它能解决你的问题。

于 2013-02-01T06:24:45.687 回答
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
}
于 2013-02-01T17:54:05.270 回答
1

根据 Tcl 文档,要比较 tcl 中的两个版本号,您应该使用 package 命令:

package vcompare version1 version2

比较由 version1 和 version2 给出的两个版本号。如果 version1 是比 version2 更早的版本,则返回 -1,如果它们相等,则返回 0,如果 version1 比 version2 晚,则返回 1。

于 2020-02-13T16:22:54.990 回答