我想生成如下所示的输出:
foo:
1
2
3
我的天真尝试会是这样puts "foo:\n [join {1 2 3} {\n }]"的,但当然这不起作用,因为{\n }它不是未转义的,而是产生了这个:
foo:
1\n 2\n 3
我似乎找不到正确的转义序列来将字符串嵌套在字符串中,这样 join 会看到空格并将转义\n到换行符。有没有办法做我想做的事?
我想生成如下所示的输出:
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"
}
经过更多的实验,这是我发现的:
只是不要逃避任何事情,这(令我惊讶的是)有效:
puts "foo:\n [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 ii {1 2 3} { puts " $ii" }
...或该主题的任何数量的多语句变体。另一个例子:
puts -nonewline "foo:\n "
puts [join {1 2 3} "\n "]
由于某些原因,多语句版本对我不起作用,但我可以使用第一个选项。