如何在 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
进行验证):
puts [lindex $list1 0]
→o\/one
puts [lindex $list1 1]
→o\/two
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]
[编辑]:如果你有一个字符串,其中有些东西用空格分隔,你可能想把它转换成一个合适的列表;这在输入数据包含大括号和(在本例中相关的)反斜杠等列表元字符时尤其有用。主要有两种方法:
set theList [split $inputString]
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
两者都有用例。
我使用以下方法创建了一个列表:
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
进行验证):
puts [lindex $list1 0]
→o\/one
puts [lindex $list1 1]
→o\/two
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]
[编辑]:如果你有一个字符串,其中有些东西用空格分隔,你可能想把它转换成一个合适的列表;这在输入数据包含大括号和(在本例中相关的)反斜杠等列表元字符时尤其有用。主要有两种方法:
set theList [split $inputString]
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
两者都有用例。