Tcl 如何在foreach循环中插入换行符并获取数据

Tcl 如何在foreach循环中插入换行符并获取数据,tcl,Tcl,我有一组字段要从文件中解析,我在foreach循环中一行一行地解析,我想知道如何跳过一行转到下一行 例如:如果遇到一个名为“ABC”的字符串,我需要在下一行中获取一个数字 some characters "ABC" 123 “ABC”几个字 123 问题是文件中有很多数字,但我需要抓取一个数字,特别是字符串“ABC”后的换行符后的数字 我该怎么做 你可以试试这个简单的解决方案 set trigger 0 set fh [open "your_file" "r"] while {[gets $f

我有一组字段要从文件中解析,我在foreach循环中一行一行地解析,我想知道如何跳过一行转到下一行

例如:如果遇到一个名为“ABC”的字符串,我需要在下一行中获取一个数字

some characters "ABC" 123 “ABC”几个字 123 问题是文件中有很多数字,但我需要抓取一个数字,特别是字符串“ABC”后的换行符后的数字

我该怎么做
你可以试试这个简单的解决方案

set trigger 0
set fh [open "your_file" "r"]
while {[gets $fh line] != -1} { 
    if {[regexp -- {"ABC"} $line]} {
        incr trigger
    continue
    }
    if {$trigger > 0} {
        puts $line ; # or do something else
        incr trigger -1
    }
}
close $fh

你可以试试这个简单的解决方案

set trigger 0
set fh [open "your_file" "r"]
while {[gets $fh line] != -1} { 
    if {[regexp -- {"ABC"} $line]} {
        incr trigger
    continue
    }
    if {$trigger > 0} {
        puts $line ; # or do something else
        incr trigger -1
    }
}
close $fh

使用
while
循环更容易一些,每次读取一行,因为当您找到触发器案例时,您可以很容易地读取额外的一行(假设您没有包含
“ABC”
):

对于
foreach
来说,这样做很尴尬,因为它每次通过循环时都会处理相同数量的元素

如果您处理的数据可能会出现上面提到的行运行问题,那么使用
foreach实际上会更好,这很奇怪:

set fd [open $theFilename]
set lines [split [read $fd] \n]
close $fd
foreach line $lines {
    incr idx; # Always the index of the *next* line
    if {
        [string match *"ABC"* $line]
        && [regexp {\d+} [lindex $lines $idx] -> num]
    } then {
        puts "Found number $num after \"ABC\""
    }
}

这是因为当你对超过末尾的内容执行
lindex
时,它会产生空字符串(与简单的正则表达式不匹配)。

循环时执行
会更容易一些,一次读取一行,因为当你找到你的触发器时,你可以很容易地读取额外的一行(假设您没有一行中有
“ABC”
):

对于
foreach
来说,这样做很尴尬,因为它每次通过循环时都会处理相同数量的元素

如果您处理的数据可能会出现上面提到的行运行问题,那么使用
foreach实际上会更好,这很奇怪:

set fd [open $theFilename]
set lines [split [read $fd] \n]
close $fd
foreach line $lines {
    incr idx; # Always the index of the *next* line
    if {
        [string match *"ABC"* $line]
        && [regexp {\d+} [lindex $lines $idx] -> num]
    } then {
        puts "Found number $num after \"ABC\""
    }
}
这是因为,当您对超过末尾的内容执行
lindex
操作时,它会生成空字符串(与简单的正则表达式不匹配)