在tcl中拆分列表后出现的杂散字符

时间:2013-01-09 03:19:52

标签: list split tcl

我经常会在列表中找到像“{\\ {”这样的字符,这是简单列表的结果,它是由空格连接或分割的。

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

我知道可以忽略等式后面跟着一个特殊符号的退格 是什么意思?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

来自the TCL manual

  

如果单词中出现反斜杠(“\”),则反斜杠   发生了替代。 [...] [他]   反斜杠被删除,后面的字符被视为   普通人物并包含在单词中。这允许角色   例如双引号,近括号和美元符号   用单词而不触发特殊处理。

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

set x abc\[def\\ghi