これをコーディングする最も簡単な方法はforeach
、分割された文字を使用することです。(正式には最も効率的ではありませんが、正しくコーディングするのは非常に簡単です。)
puts "Please enter text:"
set myText [gets stdin]
set chars [split $myText ""]
set idx 0
foreach a $chars b [lreverse $chars] {
if {[string equals -nocase $a $b]} {
lset chars $idx [string toupper $a]
}
incr idx
}
set output [join $chars ""]
puts $output
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に存在していました(ただし、一部の機能はそれ以降のバージョンよりもかなり低速でした)。