为何为concat删除换行符

时间:2018-03-13 03:21:42

标签: tcl

我有这段代码:

set l [concat a b c "\r\n"]
puts "[llength $l]:$l"

我想添加“\ r \ n”作为列表的最后一个元素,但它似乎被删除了:

>tclsh try.tcl
3:a b c

有什么原因吗?

3 个答案:

答案 0 :(得分:1)

根据Tcl的规则,\r(回车)和\n(换行符)都是空白字符,因此concat的空格字符剥离规则将它们从领导中移除和尾随的立场。正如the documentation所说(强调我的):

  

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

如果您希望列表末尾的额外双字符EOL序列不会影响列表中的值,那么之后只需append

set l [concat a b c]
append l "\r\n"
puts "$l:[llength $l]"

另一方面,如果您希望该字符串作为列表元素,lappend它将自动添加所需的所有引用。另请注意,concat不是 true 列表连接操作(它会执行复杂的字符串操作);真正的列表连接是:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

concat命令返回一个字符串,它是一个美化列表,在元素之间有一个空格,在第一个元素之前或之后没有空格。

您正在寻找的是list命令:

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

文档: concatlist