Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11149[/thread]

Problem beim Regex zuweisen an Variable

Leser: 2


<< >> 5 Einträge, 1 Seite
Tr0Nix
 2008-01-17 00:07
#104809 #104809
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen

Ich moechte mit WWW::Mechanize eine Webseite abholen und anschliessend parsen. Da ein Resultat-Set ueber 2 Zeilen geht und eine Seite mehrere solcher Result-Sets hat, parse ich mit einer Regex einen langen String der die Seite enthaelt und ignoriere die CR-Zeichen.

Das funktioniert ganz gut, wenn ich es folgendermassen mache:
Code: (dl )
1
2
3
for ($object->content =~ /<p><strong>([\W\w].+)<\/strong><br \/>[\w\W].+(http:\/\/x\.y\.z[^"]+)/g) {
print "$1: $2 \n";
}


Nun mein Problem, wenn ich 1:1 die Regular Expression in eine Variable schmeissen will und anschliessend dieselbe for-Schleife mache:

Code: (dl )
1
2
3
4
my $regex = /<p><strong>([\W\w].+)<\/strong><br \/>[\w\W].+(http:\/\/x\.y\.z[^"]+)/g;
for ($object->content =~ $regex) {
print "$1: $2 \n";
}


Kriege ich fuer diese Zeile folgende Fehlermeldung:
"Use of uninitialized value in pattern match (m//)".

Weiss jemand, was Perl sich da genau denkt? Der Debugger zeigt, dass $regex leer bleibt nach der Zuweisung. Escape ich da was nicht sauber? Gaensefuesschen escapen hat jedenfalls nichts gebracht :(

P.S. Performance und Anpassungen spielen keine Rolle, es ist mehr ein Quick & Dirty Feldversuch

P.P.S. das geht auch nicht:
Code: (dl )
my $linkRegex = m/blah/g;
renee
 2008-01-17 00:21
#104810 #104810
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
my $regex = qr{<p><strong>([\W\w].+)</strong><br />[\w\W].+(http://x\.y\.z[^"]+)}g;
siehe auch perlop unter Quote- und Quotelike Operators.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2008-01-17 20:19
#104816 #104816
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Tr0Nix+2008-01-16 23:07:52--
Code: (dl )
my $regex = /<p><strong>([\W\w].+)<\/strong><br \/>[\w\W].+(http:\/\/x\.y\.z[^"]+)/g;

Was da genau passiert, ist, dass der Regexp an Ort und Stelle ausgeführt wird (wird auf $_ angewandt) und das Ergebnis wird in $regex gespeichert.

Um einen Regex in einer Variable zu speichern, brauchst Du (wie renee schon schreibt), qr. Das hat nur noch ein Problem: Flags, die sich nicht auf die Bedeutung des Regex sondern auf die Funktion beziehen, wie /g, kannst Du bei qr nicht angeben. Das musst Du dann später beim Anwenden machen:
Code (perl): (dl )
1
2
3
my $regex = qr/.../;
...
$string =~ /$regex/g;
Tr0Nix
 2008-01-17 22:27
#104875 #104875
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Aaaaaah *klick*! Vielen Dank euch beiden! Wieder ein Stueck erleuchtet! So hats geklappt!
Strat
 2008-01-18 13:50
#104890 #104890
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
betterworld+2008-01-17 19:19:35--
Das hat nur noch ein Problem: Flags, die sich nicht auf die Bedeutung des Regex sondern auf die Funktion beziehen, wie /g, kannst Du bei qr nicht angeben.

Einige Flags kann man auch bei qr angeben, z.B. /i (oder auch m s x), wenn auch in anderer Form:
Code (perl): (dl )
1
2
3
4
5
my $re = qr/(?i:Egal)/;

if( "GrossKleinegaL" =~ /$re/ ) {
    print "egal\n";
}

Andere wie z.B. /g funktionieren so leider nicht, weil da nicht die Auswertung des Patterns, sondern die Art, wie die Re oder eventuell ein Ersetzungsteil ausgefuehrt wird, beeinflusst wird.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 5 Einträge, 1 Seite



View all threads created 2008-01-17 00:07.