在Tcl中为puts和join嵌套字符串

在Tcl中为puts和join嵌套字符串,tcl,Tcl,我希望生成如下所示的输出: foo: 1 2 3 我天真的尝试类似于放置“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

我希望生成如下所示的输出:

foo:
  1
  2
  3
我天真的尝试类似于
放置“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"
}
puts "foo:"
foreach ii {1 2 3} { puts "  $ii" }

使用双引号而不是大括号:

% puts [join {foo: 1 2 3} "\n  "]
foo:
  1
  2
  3
或者,不要尝试构建单个字符串,而是使用循环:

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

经过更多的实验,我发现:

  • 只是不要逃避任何事情,这(让我惊讶)是有效的:

  • 对空格进行编码:

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

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

    puts "foo:"
    foreach i {1 2 3} {
        puts "  $i"
    }
    
    puts "foo:"
    foreach ii {1 2 3} { puts "  $ii" }
    
    。。。或者在该主题上的任意多个语句变体。另一个例子:

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

  • 出于各种原因,多语句版本对我不起作用,但我可以使用第一个选项。

    在进行了更多实验后,我发现:

  • 只是不要逃避任何事情,这(让我惊讶)是有效的:

  • 对空格进行编码:

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

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

    puts "foo:"
    foreach i {1 2 3} {
        puts "  $i"
    }
    
    puts "foo:"
    foreach ii {1 2 3} { puts "  $ii" }
    
    。。。或者在该主题上的任意多个语句变体。另一个例子:

    puts -nonewline "foo:\n  "
    puts [join {1 2 3} "\n  "]
    
  • 出于各种原因,多语句版本不适合我,但我可以使用第一个选项