2011-01-11 4 views
0

Ich habe einen Text und ich schreibe einen Parser dafür mit regulären Ausdrücken und Perl.Wie fange ich an zu vergleichen und speichern von genauem Punkt in einem Text übereinstimmen

Ich kann was ich brauche mit zwei leeren Zeilen (ich benutze regexp), weil es ein Muster gibt, das Blöcke von Text nach zwei leeren Zeilen erkennen kann.

Aber das Problem ist, dass der gesamte Text Einleitungsteil und etwas Text am Ende habe ich nicht brauchen.

Hier ist ein Code, der Text übereinstimmt, wenn es zwei leere Zeilen

findet
#!/usr/bin/perl 

use strict; 
use warnings; 

my $file = 'first';      
open(my $fh, '<', $file); 
my $empty = 0;  
my $block_num = 1;  
open(OUT, '>', $block_num . '.txt');  

while (my $line = <$fh>) { 

chomp ($line); 
if ($line =~ /^\s*$/) { 
    $empty++;  
    } elsif ($empty == 2) {  
    close(OUT);  
    open(OUT, '>', ++$block_num . '.txt'); 
    $empty = 0; 
    } 
    else { 
    $empty = 0;} 
print OUT "$line\n"; 

} 
close(OUT); 

Dies ist Beispiel für den Text, den ich (es ist wirklich klein :))


this is file example

brauchen

Ich denke, dass ich über den Text iterieren muss, bis das Wort LOREM gefunden wird IPSUM mit regexps diese Art "/^LOREM IPSUM /", weil es der Punkt ist, von dem benötigter Text gestartet wird (und den Text in einer Datei speichern, wenn ich das Wort erreiche). Und ich muss beenden, über den Text zu iterieren, wenn INDEX Wort Born ist oder den Text in einer separaten Datei speichern.

Wie könnte ich es implementieren. Sollte ich nächste Funktion verwenden, um mit Linien fortzufahren oder was?

BR, Yuliya

+1

dies ist verwandt post http://stackoverflow.com/questions/4635833/ – yuliya

+0

ich würde die Datei schlürfen und die Blöcke übereinstimmen. Auf diese Weise musst du nicht mit der etwas hässlichen Zeilenzählung herumalbern –

+0

vielleicht hast du recht, aber ich würde es lieber mit einem Stück Code machen – yuliya

Antwort

1

Sie würden Ihre while Schleife um so etwas wie

my $in_lorem = 0; 
while (my $line = <$fh>) { 
    if($line =~ /^LOREM IPSUM/) { 
    $in_lorem = 1; 
    next; 
    } 
    next unless $in_lorem; 
    # your processing goes here 
} 

Diese Kopfzeilen wird überspringen ändern, bis Sie die Zeile, die mit LOREM IPSUM beginnt getroffen, nach denen Sie Linien verarbeiten .

Sie würden ein ähnliches Muster zum Ignorieren aller Zeilen nach einer gegebenen Übereinstimmung verwenden, mit der Ausnahme, dass Sie keine weiteren Zeilen verarbeiten müssen. Verwenden Sie also next statt last. Dieses Muster bleibt dem Leser als Übung überlassen. :-)

1

Sie könnten die flip flop range operator verwenden, um die Verarbeitung zu starten, wenn Sie LOREM IPSUM abgleichen, und stoppen, wenn Sie mit INDEX übereinstimmen.

#!/usr/bin/perl 
use strict; 
use warnings; 
use 5.010; 

my $file = 'firsttest'; 

open (my $fh, '<', $file) or die "Failed to open $file: $!"; 

while (<$fh>){ 
    if (m/^LOREM IPSUM/ .. m/^INDEX/){ 
     #Do your other matching, processing, etc. here 
     print; 
     last if m/^INDEX/;#Optional, to avoid reading remaining lines. 
    } 
} 
Verwandte Themen