2

我经常在我的列表中得到像 "{\\ {" 这样的字符,这是简单列表的结果,它是由空格连接或拆分的。

只是在寻找这些角色背后的原因。

我知道后跟特殊符号的退格可以从等式中忽略,但 \\ 是什么意思?

4

2 回答 2

3

很久以前,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
于 2013-01-09T06:10:51.030 回答
2

\\是一个转义的反斜杠,这会导致一个简单的反斜杠字符,不会触发特殊处理。

来自TCL 手册

如果反斜杠 ("\") 出现在单词中,则会发生反斜杠替换。[...] [T]反斜杠被删除,后面的字符被视为普通字符并包含在单词中。这允许将双引号、右括号和美元符号等字符包含在单词中,而不会触发特殊处理。

例如,要将变量 x 设置为字符串文字abc[def\ghi,您需要转义[and\字符:

set x abc\[def\\ghi
于 2013-01-09T05:09:47.720 回答