Tcl中的列表操作

Tcl中的列表操作,tcl,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 我尝试了拆分$a:,但没有成功。请建议

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

原始列表

$> 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
我尝试了拆分$a:,但没有成功。请建议可以做什么。

如果您有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
}
可以使用split而不是regexp执行上述操作;我更喜欢regexp,因为这样可以提取任意模式。

设置一个{123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
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
对于{set i 0}{$i<[l长度$a]}{incr i}{ lset a$i[lindex[split[lindex$a$i]:“]1] } 一美元
设置输入{123.4:xyz 123.4:pqr 123.4:xyz 123.4:abc 123.4:mno}
设置一个“”
对于{set i 0}{$i一行:

% 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

Taddaaa…如果您有正则表达式,则无需拆分。

如果您有8.5和tcllib:

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

通过使用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

还有其他方法来进行冒号拆分;这最好取决于各种因素,但REs非常灵活…我有8.4.6,所以第一个解决方案排除了。第二个解决方案集b{};foreach x$a{lappend b[regsub{^[^::*:}$x”“]}错误:错误#args:应该是“regsub”开关?exp string subsecvarName@user2643899哦,对于8.4,需要一个稍微不同的语法;将更新(当问题中提到的版本有点旧时,它确实有帮助…)我需要对列表稍作修改,你能帮我吗?我想到了这一点,但真的想避免loop@user2643899为什么避免
for
循环如此重要,以至于您宁愿在
foreach
循环中复制一个副本,从而将脚本用于列表的内存量增加一倍?;)请检查一下我刚刚发布了这么多好的答案。我喜欢Tcl!字符串修剪的最后一个参数是一组字符,所以你应该使用
“0123456789:”
。为什么要为输出构建一个字符串而不是构建一个列表?@glennjackman您将获得的输出将是一个列表。我只是在处理列表中的每个字符串,然后再次形成一个列表。我们也可以使用“0123456789:”生成与{}相同的结果@Karthik请检查我请求的新修改我需要对列表稍作修改你能帮忙吗?让我们看看我能帮忙吗?需要修改原始问题吗
struct::list map $a {apply {{elem} {lindex [split $elem :] end}}}
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