【问题标题】:Tcl adds curly braces when using `$` signTcl 在使用 `$` 符号时添加花括号
【发布时间】:2013-10-01 23:09:43
【问题描述】:
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 在第二个输出中添加了花括号。我想这是因为它使用了$ 符号。但我真的需要使用它,我不想插入大括号。这如何解释以及如何避免大括号?

【问题讨论】:

  • 大括号仅用于分组和避免变量替换。牙套有什么障碍吗?如果您将 $A 用作列表,则在使用 $A 中的元素时应该不会遇到任何问题。

标签: list tcl dollar-sign braces


【解决方案1】:

作为一般规则,不要将列表视为字符串。假装它们没有字符串表示。 (字符串表示只对序列化、调试有用,对用户没有用)。

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

你想要的:

puts [join $A]

背景:

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

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

无论用户在这里输入什么,输出总是和用户输入的一样,没有任何替换。

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

【讨论】:

  • 从字符串中取出单词的另一种方法是regexp -all -inline {\S+} $str
【解决方案2】:

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

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

foreach x $A {
    puts $x
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-13
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多