在 Tcl 中嵌套字符串以进行放置和连接

Nesting strings in Tcl for puts and join

我想生成如下所示的输出:

foo:
  1
  2
  3

我天真的尝试会是 puts "foo:\n [join {1 2 3} {\n }]" 之类的东西,但这当然行不通,因为 {\n } 不是未转义的,而是产生了这个:

foo:
  1\n  2\n  3

我似乎无法找到正确的转义序列来将字符串嵌套在字符串中,以便 join 看到空格并将 \n 转义为换行符。有没有办法做我想做的事?

使用双引号代替大括号:

% puts [join {foo: 1 2 3} "\n  "]
foo:
  1
  2
  3

或者不尝试构建单个字符串,而是使用循环:

puts "foo:"
foreach i {1 2 3} {
    puts "  $i"
}

经过更多试验后,我发现了以下内容:

  1. 只是不要转义任何东西,这(令我惊讶)有效:

    puts "foo:\n  [join {1 2 3} "\n  "]"
    
  2. 对空格进行编码:

    puts "foo:\n  [join {1 2 3} \n\x20\x20]"
    
  3. 使用一个变量:

    set delimiter "\n  "
    puts "foo:${delimiter}[join {1 2 3} $delimiter]"
    
  4. 所述,使用循环:

    puts "foo:"
    foreach ii {1 2 3} { puts "  $ii" }
    

    ... 或该主题的任意数量的多语句变体。另一个例子:

    puts -nonewline "foo:\n  "
    puts [join {1 2 3} "\n  "]
    

由于某些原因,多语句版本不适合我,但我可以使用第一个选项。