Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过TCL拆分字符串并存储在列表中_Tcl - Fatal编程技术网

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

如何通过TCL拆分字符串并存储在列表中,tcl,Tcl,有没有办法拆分字符串并保存在列表中? 如何拆分字符串并保存在两个列表中 例如,我有一个字符串,其中我用=拆分了几个字符串: a=1 b=2 c=3 d=4 a=1 b=2 c=3 d=4 然后我想创建两个这样的列表[a,b,c,d]和[1,2,3,4]:一个简单的方法可能是使用循环: % 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 %

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

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

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

% 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
如果您不介意使用正则表达式,可以尝试以下方法:

% 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

假设字符串按以下顺序放置在abc.txt文件中

a=1
b=2
c=3
d=4
您需要创建两个列表,一个用于数字,一个用于字符:

set number_list [list]
set char_list   [list]

set fh [open "abc.txt" "r"]

while {[gets $fh line] != -1} {
    regexp -- {(\S+)=(\S+)} $line foo char number
    lappend char_list   $char
    lappend number_list $number
}

close $fh

puts $char_list
puts $number_list

最简单的方法是读取中的所有数据,
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 ,]\]"
运行该命令(假设文件名正确),您将得到如下输出:

keys = [a,b,c,d] values = [1,2,3,4]
这样,您就可以按名称进行查找,而不必手动搜索。假设键是唯一的,顺序也不重要。

这已经很老了,但实际上我会用不同的方式来处理它。。。考虑到字符串是[a=1\nb=1\n…等]且变量名为“str”,类似于以下内容:

#确定字符串中的num条目
设置最大值[L长度$str]
#基于拆分字符串创建新字符串(alph&num)
设置i 0
set str[拆分$str\n]
设置alph[]
set num[]
而{$i<$max}{
设置alph“$alph[lindex[split[lindex$str$i]”=“]0]
设置num“$num[lindex[split[lindex$str$i]”=“]1]
增量i}

也许只是个人喜好,但对我来说似乎最简单;代码没有经过测试,但它与我刚刚研究的代码类似。

如果将
$data
中的等号字符替换为空格,则始终会留下一个正确的、值相等的列表(如示例中所示),那么可以做得简单得多:

set dict [string map {= { }} $data]
set keys [dict keys $dict]
set values [dict values $dict]

文档:,

下面是一个简单的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]
}

现在,列表l1中有[AB c d],l2中有[1234]

a=1,b=2,c=3,d=4是一个字符串?是的,但中间没有逗号,它们都在新行中,例如新行b=2中的a=1,等等,数组中的+1。用来检查它。
set dict [string map {= { }} $data]
set keys [dict keys $dict]
set values [dict values $dict]
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]
}