向TCL列表的元素添加额外的反斜杠

向TCL列表的元素添加额外的反斜杠,tcl,backslash,regsub,Tcl,Backslash,Regsub,我有一个列表,如下所示: list1 = {a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\] ....} 当我使用foreach循环逐个操作列表的元素时: `foreach ele $list1 { puts "$ele }` 我得到以下输出: a.b.c.d a、 bb.ccd[0] a、 bb.ccd[1] 注意,反斜杠丢失了(由于tcl语言流) 为了保持不变,我想给列表1中所有有反斜杠的元素添加一个额外的反斜杠 我试过: regsub-all{\}$list1{\

我有一个列表,如下所示:

list1 = {a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\] ....}
当我使用foreach循环逐个操作列表的元素时:

`foreach ele $list1 {
puts "$ele
}`
我得到以下输出:

a.b.c.d
a、 bb.ccd[0]
a、 bb.ccd[1]

注意,反斜杠丢失了(由于tcl语言流)

为了保持不变,我想给列表1中所有有反斜杠的元素添加一个额外的反斜杠

我试过:

regsub-all{\}$list1{\\}list1
(还尝试了双引号,而不是大括号和其他可能的尝试)

似乎什么都不管用

有没有办法确保$ele在foreach循环中保留反斜杠字符,因为我需要具有完全相同字符的元素进行进一步处理


注:使用regexp/regsub的初学者,如您所定义的,它是一个字符串。当
list1
foreach
命令一起使用时,字符串将转换为列表。请记住,Tcl中的列表实际上只是经过特殊格式化的字符串,当从字符串转换为列表时,将对其进行解析。在解析列表元素时,将根据正常的Tcl解析规则删除反斜杠。有几种方法可以构建包含对Tcl解析器非常重要的字符的列表。下面的代码显示了与您的代码相对应的两个示例:

set list1 {a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\]}
puts "list1 as a string"
puts $list1

puts "converting the list1 string to a proper list"
foreach ele $list1 {
    puts $ele
}

set list2 [list a.b.c.d {a.bb.ccd\[0\]} {a.bb.ccd\[1\]}]
puts "list2 build by the list command"
puts $list2

puts "list2, element by element"
foreach ele $list2 {
    puts $ele
}

set list3 {a.b.c.d {a.bb.ccd\[0\]} {a.bb.ccd\[1\]}}
puts "list3 build properly quoting each element"
puts $list3

puts "list3, element by element"
foreach ele $list3 {
    puts $ele
}
运行此操作将产生:

list1 as a string
a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\]
converting the list1 string to a proper list
a.b.c.d
a.bb.ccd[0]
a.bb.ccd[1]
list2 build by the list command
a.b.c.d {a.bb.ccd\[0\]} {a.bb.ccd\[1\]}
list2, element by element
a.b.c.d
a.bb.ccd\[0\]
a.bb.ccd\[1\]
list3 build properly quoting each element
a.b.c.d {a.bb.ccd\[0\]} {a.bb.ccd\[1\]}
list3, element by element
a.b.c.d
a.bb.ccd\[0\]
a.bb.ccd\[1\]

如果将每个反斜杠替换为两个反斜杠,则您的
regsub
尝试将起作用,但正确构建列表更为清晰。

如果您的输入数据中有您希望保留的反斜杠,在将数据转换为Tcl列表时,您需要做一些额外的工作,否则Tcl将简单地假设您使用反斜杠作为传统的Tcl元字符。有几种方法可以做到这一点;这是我个人最喜欢的,因为它在逻辑上精确地选择我们想要的字符(非空白的非空序列):

从输出中可以看到:

a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\] .... a、 不列颠哥伦比亚省 a、 bb.ccd\[0\] a、 bb.ccd\[1\] ....
这样可以精确地保留反斜杠。(还有,是的,我非常喜欢正则表达式。特别是像这样非常简单的表达式。)

为什么不
split
?谢谢Donald,是的,这对我很有用,因为我从以前的命令中收集了列表。@JohannesKuhn
split
的问题是当一行中有两个分隔符时会发生什么。Andy,谢谢你的澄清。从今以后,我将正确地建立列表。但是,在我当前的场景中,我从之前执行的命令中获得了一个列表。因此,唐纳德的解决方案似乎很有效。 a.b.c.d a.bb.ccd\[0\] a.bb.ccd\[1\] ....