【问题标题】:How can I split a variable by line in TCL?如何在 TCL 中逐行拆分变量?
【发布时间】:2019-06-11 11:33:25
【问题描述】:

我有一个名为“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]

但它并没有真正给我一个整洁的元素列表。是否可以从变量“结果”中获取 3 个列表?

【问题讨论】:

  • “整齐的元素列表”是什么意思;你认为什么是整洁的?

标签: list indexing split tcl


【解决方案1】:

如果我理解正确,并且您的示例数据的表示是准确的,那么您不必处理 ([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]处理时,它会自动变成一个列表。

【讨论】:

  • 如果结果超过三行怎么办?您会继续更新阈值吗?
  • 嗯,这是一个要向 OP 提出的问题,我会说:“每一行的这个阈值都不同”?练习的重点更多是为了说明results持有的值可以直接作为列表使用,不需要预处理。
【解决方案2】:

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

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";
}
}

【讨论】:

  • 非常感谢!这就是我要找的! :)
  • 虽然解决方案可能符合 OP 的意图,但它过于复杂。 split 和 regexp 不是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2021-10-24
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多