【问题标题】:Tcl: Add special characters in a listTcl:在列表中添加特殊字符
【发布时间】:2021-08-18 15:02:50
【问题描述】:

我想在列表中添加:var mylinechart = `{

set myvar "var mylinechart = `\{"
> var mylinechart = `{
lappend mylist $myvar
> var\ mylinechart\ =\ `\{

预期的结果不是那么理想...我想要这个: {var mylinechart = `{}
我做错了什么?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    tcl 打印机通常不会在外部列表或本身不是列表的列表元素周围添加方括号。但如果你有一个多维列表,那么你就会开始看到它们:

    % set mylist [list a b c]
    a b c
    % lappend mylist [list $myvar]
    a b c {var\ mylinechart\ =\ `\{}
    

    mylist 现在是一个包含四个元素的列表,其中最后一个是一个包含单个元素的列表。它仍然反斜杠所有空格,因此整个事物被视为单个元素。如果您正在执行诸如写入文件之类的操作并且不想看到它们,则可以在该元素上使用 puts

    % puts [lindex $mylist 3 0]
    var mylinechart = `{
    

    【讨论】:

      【解决方案2】:

      Tcl 列表格式化程序喜欢既不使用大括号也不使用反斜杠,但如果这不起作用(可能是因为元素包含空格或其他 Tcl 元字符)那么它使用大括号,但如果 that不起作用(通常是因为元素有不平衡的大括号)然后它使用反斜杠。反斜杠是最丑陋的选项,但它适用于任何事情。

      您的示例值有一个不平衡的大括号。这意味着当 Tcl 格式化列表时,它使用反斜杠。这可能很难看,但它有效,您可以使用 lindex 恢复该值,因此它必须是正确的。

      Tcl 不会让您控制它在格式化列表时选择使用的格式规则,至少不是在脚本级别。 (如果您在 C 库级别四处探索,可能会有更多控制,但不建议,您真正安全地做的就是强迫事情变得更丑陋。您无法安全地做到这一点不要使用反斜杠。)


      为了强调,{var mylinechart = `{} 你想要的不是一个格式正确的列表。(我将它放在下面的双引号中,以便我可以轻松输入它;它本身就是这是一件坏事的线索。)

      % set s "{var mylinechart = `{}"
      {var mylinechart = `{}
      % lindex $s 0
      unmatched open brace in list
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        相关资源
        最近更新 更多