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

tcl中两个字母数字值的比较,tcl,Tcl,谁能帮我比较一下tcl中的两个字母数字值 如果说我有两个版本的值 set val1 "2.1.a" set val2 "1.2.a" 如果我想得到两个值的最大值,即$val1(根据上面的例子),我该怎么做 除了逐字比较,还有什么办法吗 可能的值集: 1.0 1.1a 1.2.3f 2.1 提前感谢。尝试以下操作: set val1 "2.1.a" puts $val1 set val2 "1.2.a" puts $val2 puts [string compare $val2 $val1]

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

如果说我有两个版本的值

set val1 "2.1.a"
set val2 "1.2.a"
如果我想得到两个值的最大值,即$val1(根据上面的例子),我该怎么做

除了逐字比较,还有什么办法吗

可能的值集:

1.0
1.1a
1.2.3f
2.1
提前感谢。

尝试以下操作:

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

仔细查看更多细节;
希望它能解决您的问题。

我会将版本字符串分解成一个列表,逐一比较:

# 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
}
#将版本字符串拆分为标记列表
proc标记化{v}{
set v[字符串映射{“”}$v]
设置结果{}
foreach代币[分割$v.“-”]{
设置令牌\u已扫描[扫描$令牌“%d%s”编号alpha]
如果{$tokens_scanned==0}{lappend result$token};#是alpha,例如beta
如果{$tokens_scanned==1}{lappend result$number};#是数字,例如5
如果{$tokens_scanned==2}{lappend result$number$alpha};#两者都是,例如5beta
}
返回$result
}
#此函数处理的版本示例:
#1,1a,1.5,3.2b,3.2.1,3.2.1-β1
进程比较_版本{v1 v2}{
#清理数据
设置v1[标记化$v1]
设置v2[标记化$v2]
foreach令牌1$v1令牌2$v2{
如果{$token1<$token2}{return-1}
如果{$token1>$token2}{return 1}
}
返回0
}

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

package vcompare version1 version2

比较版本1和版本2给出的两个版本号。如果版本1比版本2早,则返回-1;如果它们相等,则返回0;如果版本1比版本2晚,则返回1。

这里是。如果您的版本控制系统更简单,您可以只使用
package vcompare$val1$val2
。对于这些字符串,我认为您必须更好地指定“max”的含义。“2.1.a”是否小于、等于或大于“2.1a”?“1.2.3b”是否小于“1.2.3”?