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
}

相关内容

  • 没有找到相关文章

最新更新