Tcl concat删除换行符的原因

Tcl concat删除换行符的原因,tcl,Tcl,我有以下代码: set l [concat a b c "\r\n"] puts "[llength $l]:$l" 我想添加“\r\n”作为列表的最后一个元素,但它似乎已被删除: >tclsh try.tcl 3:a b c 原因是什么?在Tcl中,列表元素由空格或换行符分隔。因此,单独使用新行并不要求它是单独的元素。您应该嵌套list元素,然后它就可以工作了 % set l [concat a b c [list "\r\n"]] a b c {

我有以下代码:

set l [concat a b c "\r\n"]
puts "[llength $l]:$l"
我想添加“\r\n”作为列表的最后一个元素,但它似乎已被删除:

>tclsh try.tcl
3:a b c

原因是什么?

在Tcl中,列表元素由空格或换行符分隔。因此,单独使用新行并不要求它是单独的元素。您应该嵌套list元素,然后它就可以工作了

% set l [concat a b c [list "\r\n"]]   
a b c {                                
}                                      
% puts "[llength $l]:$l"               
4:a b c {                              
}                                      
%                                      

concat
命令返回一个字符串,该字符串是一个经过修饰的列表,元素之间只有一个空格,在第一个元素之前或最后一个元素之后没有空格

您要查找的是
list
命令:

% set l [list a b c "\r\n"]
a b c {
}
% puts [llength $l]:$l
4:a b c {
}
文件: , 根据Tcl的规则,
\r
(回车)和
\n
(换行符)都是空白字符,因此
concat
的空白字符剥离规则将它们从前导和尾随位置移除。正如我所说的:

在修剪每个参数的前导和尾随空格后,此命令将其每个参数与空格连接在一起

如果您希望在列表末尾添加两个字符的EOL序列,而该序列不会影响列表中的值,则只需
append

set l [concat a b c]
append l "\r\n"
puts "$l:[llength $l]"
另一方面,如果希望将该字符串作为列表元素,
lappend
it as将自动添加所需的所有引用。还要记住,
concat
不是真正的列表连接操作(它执行复杂的字符串操作);真正的列表串联是:

set concatenated [list {*}$listA {*}$listB]