使用`$`符号时,Tcl会添加花括号

时间:2013-09-26 06:02:39

标签: list tcl dollar-sign braces

set B {pc_0::!mx_0 pi::$mx_0}
puts $B

set A ""
foreach x $B {
    lappend A $x
}

puts $A

该程序的输出是

pc_0::!mx_0 pi::$mx_0
pc_0::!mx_0 {pi::$mx_0}

奇怪的是,tcl在第二个输出中添加了花括号。我想这是因为它使用$符号。但我真的需要使用它,我不希望插入大括号。如何解释这个以及如何避免括号?

2 个答案:

答案 0 :(得分:8)

作为一般规则,不会将列表视为字符串。假装他们没有字符串表示。 (字符串表示仅对序列化,调试有用,但不适用于用户)。

要将文本(尤其是用户输入)转换为列表,请使用split 要将其转换回来,请使用join

你想要的Sou:

puts [join $A]

背景

list具有转义Tcl使用的所有元字符的副作用,因此当您eval此列表时,不会再进行替换。这是一个非常重要的属性,用于生成稍后将执行的回调/代码:

set userinput [gets stdin]
set code [list puts $userinput]
eval $code

无论用户在此处输入什么内容,输出始终与用户输入的内容相同,无需任何替换。

如果$不会被转义,那么评估会尝试替换$mx_0,这最有可能失败。

答案 1 :(得分:0)

为什么不以类似于创建方式的方式打印列表?

作为一名经验丰富的Tcl程序员,这对我来说似乎更直观:

foreach x $A {
    puts $x
}