在Tcl中列出操作

时间:2013-09-19 22:57:00

标签: tcl

我有一个列表,我试图修改并根据我想要实现的目标制作一个新列表。

原始列表

$> set a {123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
$> puts $a
$> 123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno

我希望我的新列表包含以下元素

$> puts $a
$> xyz pqr xyz abc mno

我试过了split $a :,但这对我没用。请建议可以做些什么。

7 个答案:

答案 0 :(得分:2)

如果你有Tcl 8.6:

set a [lmap x $x {regsub {^[^:]*:} $x ""}]

在8.5中,如果存储在另一个变量中则更容易:

set b {}
foreach x $a {
    lappend b [regsub {^[^:]*:} $x ""]
}

在8.4及之前,您还需要regsub的语法略有不同:

set b {}
foreach x $a {
    # Mandatory write back to a variable...
    regsub {^[^:]*:} $x "" x
    # Store the value; it isn't reflected back into the source list by [foreach]
    lappend b $x
}

答案 1 :(得分:2)

set b [list]
foreach item $a {
    catch { 
        regexp {\:(.*)} $item match tail 
        lappend b $tail
    }
}
puts $b

上面可以用split而不是regexp来做;我更喜欢正则表达式,因为你可以通过这种方式提取任意模式。

答案 2 :(得分:2)

一个班轮:

% set a {123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
% 123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno
set b [regexp -inline -all {[a-z]+} $a]
% xyz pqr xyz abc mno

Taddaaaa ......如果你有正则表达式,则不需要拆分。

答案 3 :(得分:1)

set a {123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
for {set i 0} {$i < [llength $a]} {incr i} {
  lset a $i [lindex [split [lindex $a $i] ":"] 1]
}
puts $a

答案 4 :(得分:0)

set input {123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
set a ""

for {set i 0} {$i<[llength $input]} {incr i} {

        set a "$a [string trim [lindex $input $i] {0,1,2,3,4,5,6,7,8,9,.,:}]"
}

这将修剪输入。

答案 5 :(得分:0)

如果你有8.5和tcllib:

struct::list map $a {apply {{elem} {lindex [split $elem :] end}}}

答案 6 :(得分:0)

通过使用split命令:

set a { 123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4 :mno }
set c [list]
foreach ele $a {
    lappend c [lindex [split $ele ":"] 1]
} 
puts $c

输出:xyz pqr xyz abc mno