如何在 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]
处理时,会自动转成列表
我有一个名为 "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]
处理时,会自动转成列表