0

我有一个包含许多值的文件。一旦找到 REGEX,我试图只提取文件中匹配的所需行。文件.txt

    ...... 
    ......
    TRIP (
            ?name           "model"
            ?prompt         "Model name"
            ?defamount       "USD100"
            ?type           "adventure"
            ?display        "no"
            ?photos       "800"
               )
    TRIP (
            ?name           "macro"
            ?prompt         "macro model name"
            ?defamount       "USD500"
            ?type           "adventure"
            ?display        "no"
            ?photos       "1200"
            )
      TRIP( 
            ?name           "description"
            ?prompt         "description"
            ?defamount       "USD400"
            ?type           "historical"
            ?display        "yes"
            ?photos       "900"
             )
            .......
........
.....
.......
......

我想提取带有“名称和型号”的行,然后是“名称和描述”以及这些行我想提取第一个“defamount”,一旦“名称和型号”的行匹配,然后是“名称和描述”。我尝试了循环,但没有成功

use strict;
open FILE, "<File.txt";
open FILE2, ">>data1.l";

while (my $string = <FILE>) {

    if ($string =~ m/^ CELL/ig) {

        print FILE2 $string;
    }
    elsif ($string =~ m/"model"/i) {

        print FILE2 $string;
    }
    elsif ($string =~ m/defamount/o) {

        print FILE2 $string;
    }
    elsif($string =~ m/"description"/i) {

        print FILE2 $string;
    }
    elsif($string =~ m/defamount/o) {

        print FILE2 $string;
    }
}
close FILE;
close FILE2; 

这给了我文件中的所有“defamount”行,但我只想要匹配上述正则表达式后的第一个 defamount

4

1 回答 1

1

这些if...elsif结构中的每一个都是在输入的每一行上计算的。您需要将它们视为一组线,因此跟踪您是否已经匹配了一条线以确定这是否是您想要保留的组。

在不完全重写程序的情况下,您需要执行以下操作:

my $keep = 0;

while(my $string = <FILE>){
    if ($string =~ m/name\s+/){ #matches name, start of new group
        if ($string =~ m/"(model|description)"/){ # keep this group
            $keep = 1;
            print FILE2 $string;
        } else { #discard this group
            $keep = 0;
        }
    }
    if ($string =~ m/defamount/ && $keep){ #only print if in a 'keep' block
        print FILE2 $string;
    }
}

老实说,如果我从头开始,我会以完全不同的方式写这个。那是您在那里进行的一些非常农业的perl。但希望我所写的逻辑能帮助你继续前进。

于 2012-09-10T02:51:46.680 回答