Tcl列表输出修改

时间:2013-10-02 20:22:26

标签: regex tcl

我有一个名为“a”的列表,需要执行一些基本的列表操作和命令,以便在另一个列表中获得所需的结果“b”

此列表“a”可以按照我在下面显示的一个示例的任何顺序包含更多元素

(%) set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno}

 {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]} mno}

目前,我试过这个并获得了

(%) set b ""
(%)    
(%) foreach l $a {
       lappend b [regsub -all [lindex $l 0] $l ""]
    }
(%) puts $b

 {{p_q[5]}} {{r_s[6]}} {}

相反,我希望“b”输出如下

p_q[5] r_s[6] mno

Tcl版本:8.4.6

2 个答案:

答案 0 :(得分:1)

如果我能正确理解您的问题,这是一种可能的解决方案:

set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno}
puts $a

set b [list]
foreach item $a {
    lappend b [lindex $item end]
}
puts ">$b<"
set b [concat {*}$b]
puts ">$b<"

输出:

{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno
>{p_q[5]} {r_s[6]} mno<
>p_q[5] r_s[6] mno<

讨论

  1. 循环遍历列表a
  2. 中的每个项目
  3. 对于每件商品,挑选最后一个子商品并将其附加到b
  4. 列表退出后,b几乎就是您想要的(请参阅输出中的第二行)
  5. 拨打concat可以根据自己的喜好进行修复。
  6. 更新

    Donal Fellows指出,我可以使用[concat {*}$b]而不是[join $b]。这种方法有几个我喜欢的优点:

    • 适用于较旧的8.4系统,不支持{*}构造
    • 理解起来更简单

    然而,concat方法提供了一个优势:速度。请查看以下交互式会话:

    (Downloads2) 61 % set b {{p_q[5]} {r_s[6]} mno}
    {p_q[5]} {r_s[6]} mno
    (Downloads2) 62 % time {concat {*}$b} 10000
    0.43452700000000005 microseconds per iteration
    (Downloads2) 63 % time {join $b} 10000
    0.603005 microseconds per iteration
    

    在这种情况下,concat速度比join快约30%。

答案 1 :(得分:1)

所以这里有一个班轮给你:

% set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno}
  {123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno
% set b [lsearch -all -regexp -not -inline [regsub -all "\{|\}" $a ""] ":"]
{p_q[5]} {r_s[6]} mno

如果进一步,您要删除{},然后

%set b [regsub -all "\{|\}" $b ""]