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 在第二个输出中添加了花括号。我想这是因为它使用$
符号。但我真的需要使用它,我不想插入大括号。如何解释这一点以及如何避免大括号?
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 在第二个输出中添加了花括号。我想这是因为它使用$
符号。但我真的需要使用它,我不想插入大括号。如何解释这一点以及如何避免大括号?
作为一般规则,不要将列表视为字符串。假装它们没有字符串表示。(字符串表示只对序列化、调试有用,对用户没有用)。
要将文本(尤其是用户输入)转换为列表,请使用split
.
要将其转换回来,请使用join
.
搜你想要的:
puts [join $A]
列表具有转义 Tcl 使用的所有元字符的副作用,因此当您使用此列表时不会发生进一步的替换。eval
这是生成稍后将执行的回调/代码的一个非常重要的属性:
set userinput [gets stdin]
set code [list puts $userinput]
eval $code
无论用户在这里输入什么,输出总是和用户输入的一样,没有任何替换。
如果$
不会被转义,那么评估将尝试替换$mx_0
,这很可能会失败。
为什么不以类似于创建列表的方式打印列表?
作为一名经验丰富的 Tcl 新手,这对我来说似乎更直观:
foreach x $A {
puts $x
}