Mit Perls regulären Ausdrücken mehrzeilig matchen
Eigentlich ist es ganz einfach, den Inhalt zwischen zwei bestimmten Zeilen mit Perl zu ermitteln. Im normalen Modus trifft die Zeichenklasse “\s” (für Whitespaces) auch auf Newlines zu. Lediglich damit die Zeichenklasse “.” auch Newlines einschließt, muss der Schalter “s” für Singleline gesetzt werden. Zwei Stolpersteine hatte ich noch: Zum Verarbeiten mehrerer Treffer muss (natürlich) der Schalter “g” gesetzt sein muss. Ohne den Schalter läuft die Regexerkennung in einer beschaulichen Endlosschleife vor sich hin. Der zweite Stolperstein war, dass ich den Regex um einen Ausschnitt eines HTML Quelltextes gebaut habe und vergessen hatte, dass für den Schalter “x” auch Leerzeichen maskiert werden müssen.
##############################################
#!/usr/bin/perl
my $file=”";
open(FH, “<anyfile.txt”);
while (<FH>) { $file.=$_;}
close(FH);
while ($file=~m/
zeile\ davor
\s*([\w\n]+)\n
\s*zeile\ danach
/xg)
{
print “$1\n”;
}
##############################################
Eines der Perl-Mottos ist ‘there’s more than one way to do it’. Aber für Fehlerbehandlung bei File-IO sollte schon Zeit sein:
my $file;
open(FH, “<anyfile.txt”)
or die(”anyfile.txt will nicht gelesen werden:$!”);
{
local $/ = undef; # Zeilenbegrenzer weg, aber nur local
# innerhalb der geschwungenen klammern
$file = <FH>;
close(FH);
}