比较字符串的TCL程序

比较字符串的TCL程序,tcl,Tcl,我试图创建一个程序,比较第一个和最后一个字符,比较第二个和第二个到最后一个字符,比较第三个和第三个到最后一个字符,依此类推,如果这些字符中的任何一个匹配,这两个字符将转换为该字符的大写字母 例如: 请输入文本:你好,菲律宾 决赛:你好,菲律宾 我不能创建任何代码,我被卡住了 puts "Please enter text:" set myText [gets stdin] string index $myText 4 有人能帮帮我吗?这个过程还将把菲律宾语中的第一个i大写,因为它与字符串的

我试图创建一个程序,比较第一个和最后一个字符,比较第二个和第二个到最后一个字符,比较第三个和第三个到最后一个字符,依此类推,如果这些字符中的任何一个匹配,这两个字符将转换为该字符的大写字母

例如:

请输入文本:你好,菲律宾 决赛:你好,菲律宾

我不能创建任何代码,我被卡住了

puts "Please enter text:"
set myText [gets stdin]

string index $myText 4 

有人能帮帮我吗?

这个过程还将把菲律宾语中的第一个
i
大写,因为它与字符串的开头和结尾的距离相等

proc compare_chars {str} {
    set letters [split $str ""]
    for {set i [expr {[llength $letters] / 2}]} {$i >= 0} {incr i -1} {
        set a [lindex $letters $i]
        set b [lindex $letters end-$i]
        if {$a eq $b} {
            lset letters $i [set L [string toupper $a]]
            lset letters end-$i $L
        }
    }
    join $letters ""
}
puts [compare_chars "Hello Phillipines"]
# outputs =>  HEllo PhIllipinEs

这个过程还将大写菲律宾的第一个
i
,因为它与字符串的开始和结束距离相等

proc compare_chars {str} {
    set letters [split $str ""]
    for {set i [expr {[llength $letters] / 2}]} {$i >= 0} {incr i -1} {
        set a [lindex $letters $i]
        set b [lindex $letters end-$i]
        if {$a eq $b} {
            lset letters $i [set L [string toupper $a]]
            lset letters end-$i $L
        }
    }
    join $letters ""
}
puts [compare_chars "Hello Phillipines"]
# outputs =>  HEllo PhIllipinEs

最简单的编码方法是在拆分字符上使用
foreach
。(从形式上讲,这不是最有效的,但很容易正确编码。)

注意,
foreach
正在迭代列表的副本;并发修改没有问题。事实上,从编码的角度来看,唯一一个模糊不清的棘手部分实际上是我们需要跟踪要修改的索引,在上面的
idx
变量中


使用Tcl 8.6,您可以编写:

set chars [split $myText ""]
set output [join [lmap a $chars b [lreverse $chars] {
    expr {[string equals -nocase $a $b] ? [string toupper $a] : $a}
}] ""]
但这取决于是否有新的
lmap
命令


如果你真的坚持使用8.3(它是不受支持的,多年来一直如此,所以你应该优先升级到更新的版本),那么试试以下方法:

set chars [split $myText ""]
set idx [llength $chars]
set output {}
foreach ch $chars {
    if {[string equals -nocase $ch [lindex $chars [incr idx -1]]]} {
        append output [string toupper $ch]
    } else {
        append output [string tolower $ch]
    }
}

它使用的所有功能都出现在8.3中(尽管有些功能比更高版本慢得多)。

编写此代码的最简单方法是在拆分字符上使用
foreach
。(从形式上讲,这不是最有效的,但很容易正确编码。)

注意,
foreach
正在迭代列表的副本;并发修改没有问题。事实上,从编码的角度来看,唯一一个模糊不清的棘手部分实际上是我们需要跟踪要修改的索引,在上面的
idx
变量中


使用Tcl 8.6,您可以编写:

set chars [split $myText ""]
set output [join [lmap a $chars b [lreverse $chars] {
    expr {[string equals -nocase $a $b] ? [string toupper $a] : $a}
}] ""]
但这取决于是否有新的
lmap
命令


如果你真的坚持使用8.3(它是不受支持的,多年来一直如此,所以你应该优先升级到更新的版本),那么试试以下方法:

set chars [split $myText ""]
set idx [llength $chars]
set output {}
foreach ch $chars {
    if {[string equals -nocase $ch [lindex $chars [incr idx -1]]]} {
        append output [string toupper $ch]
    } else {
        append output [string tolower $ch]
    }
}

此应用的所有功能都出现在8.3中(尽管有些功能比更高版本慢得多)。

您好,谢谢!但是我的tCL不识别lset命令和lreverse,我使用的是旧版本,即8.38.3???升级8.3已经多年没有得到支持了(除非你能够说服某人在商业基础上这样做),8.4即将进入同样的位置(它的最终补丁版本8.4.20可能在下个月内发布)。@Dhenn,lreverse可以像
proc lreverse{a_list}{set rev[list];for{set i]那样实现[expr{[llength$a_list]-1}}{$i>=0}{incr i-1}{lappend rev[lindex$a_list$i]};return$rev}
谢谢!但是我的tCL不识别lset命令和lreverse,我使用的是旧版本,版本是8.38.3???升级!8.3已经多年不受支持了(除非你已经能够说服某人在商业基础上这样做),8.4即将进入相同的位置(它的最终补丁版本-8.4.20-可能在下个月内发布)。@Dhenn,lreverse可以像
proc lreverse{a_list}{set rev[list];for{set i[expr{[llength$a_list]-1}{$i>=0}那样实现{incr i-1}{lappend rev[lindex$a_list$i]};return$rev}
这很好,但是我的tCL不识别lset命令和lreverse,我使用的是旧版本,即版本8。3@Dhenn,在本例中,您可以像这样实现lset:
proc lset{varname index value}{upvar 1$varname var;set var[lreplace$var$index$index$value]}
这很好,但我的tCL不识别lset命令和lreverse,我使用的是旧版本,即版本8。3@Dhenn,在本例中,您可以像这样实现lset:
proc lset{varname index value}{upvar 1$varname var;set var[lreplace$var$index$index$value]}