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

How can I split a variable by line in 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"?

中获取 3 个列表

我认为最好是根据换行符拆分,然后应用正则表达式来获取数据。我试过示例代码。

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}

背景:当$results[lmap]处理时,会自动转成列表