TCL 有没有办法在 while gets 语句中模式匹配一行?

问题描述 投票:0回答:1

这个 TCL 应该解析文件直到找到模式。然后会有数量可变的某种序言行,它们具有不同的独特模式,我想跳过这些行,然后对接下来的行做有趣的事情。因此,一旦模式匹配,我就需要去掉序言行。我知道这些线条的模式,但不知道有多少。可能为零到 N。

寻找在 while 获取条件内是否可以进行模式检查的方法。

类似于(伪 TCL 代码):

set fp [ open $fname ]
while { [gets $fp line] >= 0 } {
    if {[regexp $pat $line]} {
        while { [gets $fp line] == some preamble } { skip }
        Now do something with $line
    ...
    }
} 
close $fp

while 可以分成多行。但有没有一种单行解决方案?

loops tcl
1个回答
0
投票

我不知道有任何专门用于此目的的东西。问题是你需要一个小状态机来判断行何时“有趣”,而这类事情往往是非常特定于格式的。

不过,您可以编写一个辅助程序。

proc forEachInterestingLine {lineVar channel body} {
    upvar 1 $lineVar var
    set interesting 0
    while {[gets $channel var] >= 0} {
        if {!$interesting} {
            set interesting [regexp START_INTERESTING $var]
        }
        if {$interesting} {
            uplevel 1 $body
            set interesting [expr {![regexp END_INTERESTING $var]}]
        }
    }
}

set ch [open thefile.txt]
forEachInterestingLine line $ch {
    # do something here
    puts $line
}
close $ch

您需要定义什么标记有趣部分的开始和结束(如果您想从有趣性中排除开始和结束标记,测试的顺序会有点不同)。

© www.soinside.com 2019 - 2024. All rights reserved.