regex pattern und replace argumente in einer Funktion nutzen.

24/11/2007 - 17:40 von Gerhard Wolf | Report spam
Hallo,

ich wollte mir gerade eine Funktion bauen mit 3 Argumenten
1: eine URL
2: ein Regulàrer Ausdruck
3: ein replace Argument
um eine substitution in eine Funktion zu packen.

Das klappt aber nicht wie gewünscht. In dem Beispiel sollte
23.11.07 17:59 - 0,596
ausgegeben werden. Im Subst (in der Funktion) habe ich verschiedene
Varianten mit '\' ausporbiert ohne Erfolg.


#!/usr/bin/perl
use LWP::Simple;

&getHTMLContent('http://www.benzinpreis.de','.+Rohö.+textfont>(\d+\
\d+\.\d+ \d+:\d+).+?<font size=2><b>(\d+\,\d+).+','$1 - $2');


sub getHTMLContent {
my $content = get $_[0];
$content =~ s/$_[1]/$_[2]/ms;
print $content;
}
 

Lesen sie die antworten

#1 sheinrich
25/11/2007 - 19:31 | Warnen spam
Hallo Gerhard,

On Nov 24, 5:40 pm, Gerhard Wolf wrote:
Hallo,

ich wollte mir gerade eine Funktion bauen mit 3 Argumenten
1: eine URL
2: ein Regulàrer Ausdruck
3: ein replace Argument
um eine substitution in eine Funktion zu packen.

Das klappt aber nicht wie gewünscht. In dem Beispiel sollte
23.11.07 17:59 - 0,596
ausgegeben werden. Im Subst (in der Funktion) habe ich verschiedene
Varianten mit '\' ausporbiert ohne Erfolg.


Du moechtest also eine formatierte Ausgabe unter Verwendung einzelner
Teilstrings aus der HTML-Seite erreichen.
Eine Substitution ist dafuer nicht notwendig, da du die HTML-Seite
nicht weiterverwenden willst.
Es reicht ein einfaches Patternmatching.



#!/usr/bin/perl
use LWP::Simple;

&getHTMLContent('http://www.benzinpreis.de','.+Rohö.+textfont>(\d+\
\d+\.\d+ \d+:\d+).+?<font size=2><b>(\d+\,\d+).+','$1 - $2');


Dein Pattern enthaelt Fehler.
Die Umlaute sind in der Quelle durch Entities kodiert. Du musst sie
also auch im Pattern verwenden.
Es fehlt der erste feste Punkt im Datum (vielleicht Cut & Paste?).
Es ist auch unnoetig kompliziert aufgebaut.


sub getHTMLContent {
my $content = get $_[0];
$content =~ s/$_[1]/$_[2]/ms;


Du verwendest die Modifier m (multiline) und s (single line), die sich
widersprechen und hier auch nicht gebraucht werden, da du keinen der
Zeilenanker ^ oder $ benutzt.

print $content;


Du willst die formatierten Matches, nicht den HTML-Content.

}



Ich schlage die Verwendung der Funktionen printf oder sprintf vor.
Nachteil: Die Argumente werden in derselben Reihenfolge der Matches
eingebaut.
Hier funktioniert das, aber ich weiss nicht, was du mit der Sub sonst
noch vorhast ;-)
Du muesstest entweder in deiner Routine die Reihenfolge umbauen oder
nacheinander mehrere Matches vornehmen.
Es gibt auch eine Syntax nach der man im printf-Format angegeben kann,
den wievielten Parameter die Schablone benutzen soll, aber ich habe
sie noch nie in Perl verwendet. (man printf nachschauen)

#!/usr/bin/perl
use LWP::Simple;

getHTMLContent('http://www.benzinpreis.de',
'Roh&ouml;lpreis.+textfont>([\d.]+ [\d:]+).+?<font size=2><b>([\d,]
+)',
'%s - %s');

sub getHTMLContent {
my $content = get $_[0];

if (my (@matches) = ($content =~ /$_[1]/)) {
printf $_[2], @matches;
} else {
print "No Match";
}
}

Steffen

Ähnliche fragen