多くの場合、スペースで連結または分割された単純なリストの結果である "{\\ {" のような文字がリストに表示されます。
これらのキャラクターの背後にある理由を探しているだけです。
特別な記号が続くバックスペースは方程式から無視できることは知っていますが、\\ はどういう意味ですか?
ずっと前に、Tcl のすべては、リストを含む文字列として内部的に格納されていました。後で互いに区別できるように、リスト要素を区切るために空白が選択されました...
set planets [list "mercury" "venus" "march"] ;# stored in planets as "mercury venus march"
puts [lindex $planets 2] ;# lindex treats it's first (string) argument as a list, and splits on whitespace to find the third element
...しかし、実際のリスト要素にこれらを格納できるようにするには、空白文字をエスケープ/引用する何らかの方法が必要でした。{
そして}
、これに使用されました...
set programs [list "hello world" "primes"] ;# stored in programs as "{hello world} primes"
...そして、エスケープできるようにする必要があります と{
など}
.
最新の Tcl バージョンでは、リストはより効率的に内部に保存されますが、スクリプト作成者の観点からは、下位互換性やその他の理由から、リストは依然としてそのように保存されています。したがって、リストを文字列として使用すると、スペース、中括弧、およびバックスラッシュを含むリストのこの文字列表現が得られます。
あなたの質問に対する簡単な解決策は、リストを文字列として扱わないことです。つまり、コマンドが文字列を期待する引数としてリストを送信しないでください。実際に要素に配置しない限り、特別なエスケープシーケンスは表示されません。
puts $mylist ;# bad unless used for debugging
puts [join $mylist] ;# good
また、文字列をリストとして扱わないでください:
set mystring "word1 {hello word3"
puts [lindex $mystring 1] ;# will throw an error
puts [lindex [split $mystring] 1] ;# good
\\
エスケープされたバックスラッシュで、特別な処理をトリガーしない単純なバックスラッシュ文字になります。
TCLマニュアルから:
バックスラッシュ ("\") が単語内にある場合、バックスラッシュ置換が発生します。[...] [T] バックスラッシュを削除し、次の文字を通常の文字として扱い、単語に含めます。これにより、特別な処理をトリガーすることなく、二重引用符、閉じ括弧、ドル記号などの文字を単語に含めることができます。
たとえば、変数 x を文字列リテラルに設定するには、および文字abc[def\ghi
をエスケープする必要があります。[
\
set x abc\[def\\ghi