【问题标题】:stray characters coming after splitting the list in tcl在 tcl 中拆分列表后出现的杂散字符
【发布时间】:2013-01-09 03:19:52
【问题描述】:

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

只是寻找这些字符背后的原因。

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

【问题讨论】:

    标签: list split tcl


    【解决方案1】:

    很久以前,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
    

    【讨论】:

    • 谢谢。另外,拆分命令的输出是否给出字符串?拆分后我确实看到了很多杂散字符。
    • @sudeepmathew 不,split 接受一个字符串并返回一个列表,而join 则相反。
    • +1 我希望我能更多地支持这个答案。强调一点:不要将列表视为字符串,反之亦然。使用转换命令splitjoin
    • 我忘了提list使用的转义语法不是随机的,这样做是为了得到的字符串,除了用于再次提取元素之外,还可以使用作为一个脚本,其中每个元素都将成为脚本中的一个单词。 list $a $b $c 的结果可以作为脚本发送到例如evalaftera 中的命令将使用两个参数调用:bc 的内容。 abc 可以包含任何奇怪的字符;它们将在列表/脚本字符串中被引用。所以这是您需要将列表视为字符串的一种情况(唯一?)。
    【解决方案2】:

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

    来自the TCL manual

    如果单词中出现反斜杠(“\”),则反斜杠 发生替代。 [...] [这 反斜杠被删除,以下字符被视为 普通字符并包含在单词中。这允许字符 例如要包含的双引号、右括号和美元符号 在没有触发特殊处理的情况下。

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

    set x abc\[def\\ghi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 2012-04-11
      相关资源
      最近更新 更多