如何在 tcl 中精确复制?

How to copy exactly in tcl?

我使用以下方法创建了一个列表:

set list1 { o\/one o\/two o\/three }

现在我想通过向每个项目添加 { } 将此列表复制到另一个列表 我的新列表应该变成:

{ {o\/one} {o\/two} {o\/three} }

我试过使用

foreach a $list1 {
    set x "{$a}"
    append new_list " " "{$a}"
    lappend new_list1 $x
}

newlist{o\/one} {o\/two} {o\/three}
newlist1{{o\/one}} {{o\/two}} {{o\/three}}

请帮忙?

您的原始列表中包含这些项目(您可以使用 lindex 进行验证):

  1. puts [lindex $list1 0]o\/one
  2. puts [lindex $list1 1]o\/two
  3. puts [lindex $list1 2]o\/three

任何包含这些元素的列表,无论如何编码,是成对等价的。列表的规范形式(由 Tcl 自己的列表操作生成)是:

{o\/one} {o\/two} {o\/three}

也许最简单的获取方式是:

set list2 [lrange $list1 0 end]

lrange 命令使用 Tcl 的标准列表到字符串引擎(与许多其他命令共享)。更喜欢 not 添加大括号,但更喜欢添加大括号而不是添加反斜杠;反斜杠是最后的手段,因为它们丑陋且难以阅读。但它适用于元素中的任意内容;只是盲目地添加大括号很容易受到棘手的边缘情况的影响。

获得上述规范形式的另一种方法是(前提是您没有停留在不再受支持的太旧的 Tcl 版本上):

set list2 [list {*}$list1]

[编辑]:如果你有一个字符串,其中有些东西用空格分隔,你可能想把它转换成一个合适的列表;这在输入数据包含大括号和(在本例中相关的)反斜杠等列表元字符时尤其有用。主要有两种方法:

  1. set theList [split $inputString]
  2. set theList [regexp -all -inline {\S+} $inputString]

当输入字符串在两个单词之间有两个(或更多)空格时,它们的不同之处在于:

set inputString "a b  c d";                    # NB: two spaces between b and c
puts [split $inputString];                     # ==> a b {} c d
puts [regexp -all -inline {\S+} $inputString]; # ==> a b c d

两者都有用例。