0

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

foo:
  1
  2
  3

我的天真尝试会是这样puts "foo:\n [join {1 2 3} {\n }]"的,但当然这不起作用,因为{\n }它不是未转义的,而是产生了这个:

foo:
  1\n  2\n  3

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

4

2 回答 2

2

使用双引号代替大括号:

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

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

puts "foo:"
foreach i {1 2 3} {
    puts "  $i"
}
于 2021-01-09T20:50:54.153 回答
0

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

  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  "]
    

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

于 2021-01-11T19:11:50.407 回答