List 如何在TCL中按行拆分变量?

List 如何在TCL中按行拆分变量?,list,indexing,split,tcl,List,Indexing,Split,Tcl,我有一个名为“results”的变量,其值为: {0 0 0 0 0 0 0 0 0 0 0 3054 11013} {0 0 0 0 0 0 0 0 0 0 0 5 13 15} {0.000 3272.744 12702.352 30868.696} 我想将每一行(在“{}”之间的值)存储在一个单独的变量中,然后将每一行的每个元素与一个阈值进行比较(每一行的阈值不同,这就是我需要拆分它们的原因) 我试过了 set result [split $results \n] 但它并没有给我一个简

我有一个名为“results”的变量,其值为:

{0 0 0 0 0 0 0 0 0 0 0 3054 11013}
{0 0 0 0 0 0 0 0 0 0 0 5 13 15}
{0.000 3272.744 12702.352 30868.696}
我想将每一行(在“{}”之间的值)存储在一个单独的变量中,然后将每一行的每个元素与一个阈值进行比较(每一行的阈值不同,这就是我需要拆分它们的原因)

我试过了

set result [split $results \n]

但它并没有给我一个简洁的元素列表。要从变量“results”中获得3个列表,我认为最好根据新行字符进行拆分,然后应用regexp获取数据。我尝试了一个示例代码

set results "{0 0 0 0 1}
{2 2 3 3 3}
{1 1 2 3 4}";
set result [split $results \n];
foreach line $result {
if {[regexp {^\s*\{(.+)\}\s*} $line Complete_Match Content]} {
puts "$Content\n";
}
}

如果我理解正确,并且示例性数据的表示是准确的,那么您不必处理(
[split]
)由
results
保存的数据,而是将其留给Tcl的列表解析器。换句话说,输入已经是Tcl列表的有效字符串表示形式,可以进行进一步处理。观察:

set results {
    {0 0 0 0 1}
    {2 2 3 3 3}
    {1 1 2 3 4}
};

set thresholds {
    3
    2
    1
}

lmap values $results threshold $thresholds {
    lmap v $values {expr {$v >= $threshold}}
}
这将产生:

{0 0 0 0 0} {1 1 1 1 1} {1 1 1 1 1}

背景:当
[lmap]
处理
$results
时,它将自动变成一个列表。

您所说的“整洁的元素列表”是什么意思;你认为整洁吗?非常感谢!这就是我要找的!:)虽然解决方案可能符合OP的意图,但过于复杂
split
regexp
不是必需的。如果结果中的行数超过三行怎么办?你会不断更新阈值吗?好吧,这是一个要向OP提出的问题,我会说:“每行的阈值都会不同”?本练习的重点更在于表明,
results
持有的值可以直接用作列表,无需预处理。