比较字符串的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]}