代码之家  ›  专栏  ›  技术社区  ›  my_question

concat删除换行符的原因

tcl
  •  0
  • my_question  · 技术社区  · 8 年前

    我有以下代码:

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

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

    >tclsh try.tcl
    3:a b c
    

    有什么原因吗?

    3 回复  |  直到 8 年前
        1
  •  1
  •   Donal Fellows    8 年前

    二者都 \r (回车)和 \n (换行符)是符合Tcl规则的空白字符,因此 concat 将其从领先和落后位置移除。像 the documentation 说(强调我的):

    此命令将其每个参数与空格连接在一起 在从每个 其中之一。

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

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

    另一方面,如果希望该字符串作为列表元素, lappend 它将自动添加所需的所有报价。还要记住 康卡特 不是一个 真的 列表串联操作(它执行复杂的字符串操作);真正的列表串联是:

    set concatenated [list {*}$listA {*}$listB]
    
        2
  •  0
  •   Dinesh    8 年前

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

    % set l [concat a b c [list "\r\n"]]   
    a b c {                                
    }                                      
    % puts "[llength $l]:$l"               
    4:a b c {                              
    }                                      
    %                                      
    
        3
  •  0
  •   Peter Lewerin    8 年前

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

    你要找的是 list 命令:

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

    文件: concat ,则, list