如何通过TCL拆分字符串并存储在列表中

use*_*871 4 tcl

有没有办法分割字符串并保存在列表中?如何拆分字符串并保存在两个列表中例如,我有一个字符串,我在其中分割了几个字符串=:

a=1
b=2
c=3
d=4

然后我想创建两个这样的列表[a,b,c,d][1,2,3,4]:

Don*_*ows 6

最简单的方法是将所有数据读split入行中,然后regexp与每行一起使用以提取片段.

set f [open "theFile.txt"]
set lines [split [read $f] "\n"]
close $f

set keys [set values {}]
foreach line $lines {
    if {[regexp {^([^=]*)=(.*)$} $line -> key value]} {
        lappend keys $key
        lappend values $value
    } else {
        # No '=' in the line!!!
    }
}

# keys in $keys, values in $values

puts "keys = \[[join $keys ,]\]"
puts "values = \[[join $values ,]\]"
Run Code Online (Sandbox Code Playgroud)

运行它(假设文件名是正确的),你会得到如下输出:

keys = [a,b,c,d]
values = [1,2,3,4]

收集这样的两个列表可能不是最好的事情.通常,最好是存储在数组中:

# Guarded by that [regexp] inside the foreach
set myArray($key) $value
Run Code Online (Sandbox Code Playgroud)

像这样,您可以按名称进行查找,而不必手动搜索.假设密钥是唯一的,订单无关紧要.


小智 6

以下是一个简单的tcl代码

set s "a=1\nb=2\nc=3\nd=4"
set s [split $s "\n"]
foreach e $s {
    set e [split $e "="]
    lappend l1 [lindex $e 0]
    lappend l2 [lindex $e 1]
}
Run Code Online (Sandbox Code Playgroud)

现在你有 [abcd] 的列表 l1 和 l2 有 [1 2 3 4]


Jer*_*rry 3

一个简单的方法可能是使用循环:

% set lines "a=1\nb=2\nc=3\nd=4"
a=1
b=2
c=3
d=4
% set expressionList [split $lines "\n"]
a=1 b=2 c=3 d=4
% set var [list]
% set val [list]
% foreach i $expressionList {
    set variable [lindex [split $i "="] 0]
    set value [lindex [split $i "="] 1]
    lappend val $value
    lappend var $variable
}
% puts $var
a b c d
% puts $val
1 2 3 4
Run Code Online (Sandbox Code Playgroud)

如果你不介意正则表达式,你可以尝试这样的事情:

% set lines "a=1\nb=2\nc=3\nd=4"
a=1
b=2
c=3
d=4
% set var [regexp -inline -lineanchor -all -- {^[^=\n\r]+} $lines]
a b c d
% set val [regexp -inline -lineanchor -all -- {[^=\n\r]+$} $lines]
1 2 3 4
Run Code Online (Sandbox Code Playgroud)