没有lsort -nocase选项的TCL 8.4解决方法?

时间:2012-02-22 11:47:10

标签: sorting tcl case-insensitive

我正在使用 -nocase 标记执行简单的TCL lsort 。但是,我正在运行该代码的一个系统仍在使用 TCL 8.4 ,其中nocase不可用。有没有简单的解决方法,还是我必须手动处理?

3 个答案:

答案 0 :(得分:3)

TCL 8.4具有-dictionary标志,该标志提供不区分大小写的比较。如果你的字符串中没有数字,我认为行为等于-nocase标志。

来自文档:

<强> -dictionary     使用字典式比较。这与-ascii相同,除了(a)除了作为平局之外被忽略的情况和(b)如果两个字符串包含嵌入数字,则数字比较为整数,而不是字符。例如,在-dictionary模式中,bigBoy在bigbang和bigboy之间排序,而x10y在x9y和x11y之间排序。

<强> -nocase     导致比较以不区分大小写的方式处理。如果与-dictionary,-integer或-real选项结合使用则无效。

http://www.hume.com/html85/mann/lsort.html

答案 1 :(得分:2)

这是Schwartzian变换:

set lst {This is a Mixed Case sentence and this is the End}
set tmp [list]
foreach word $lst {lappend tmp [list $word [string tolower $word]]}
unset lst
foreach pair [lsort -index 1 $tmp] {lappend lst [lindex $pair 0]}
puts $lst

输出

a and Case End is is Mixed sentence the This this

答案 2 :(得分:1)

编写自己的字符串比较程序:

proc nocaseCompare {a b} {
    set a [string tolower $a]
    set b [string tolower $b]
    if {$a < $b} {
        return -1
    } elseif {$a > $b} {
        return 1
    } else {
        return 0
    }
}


set lst {This is a Mixed Case sentence and this is the End}
puts [lsort -command nocaseCompare $lst]

输出:

a and Case End is is Mixed sentence the This this