Schrift
[thread]11245[/thread]

Aus einer Variable für REGEX code ausführen?

Leser: 2


<< >> 10 Einträge, 1 Seite
toby
 2008-02-05 00:52
#105561 #105561
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo Forum,

habe mein kompliziertes Problem auf ein Minimum gedumpt. Dieses Minimum ergibt allerdings keinen Sinn, also nicht wundern. ;) Es wurde nur erstellt um zu verdeutlichen, was ich vorhabe...

Bsp1: normaler regex
Code: (dl )
1
2
my $regex = 'y';
print "ja\n" if "xyz" =~ m/x${regex}z/;


Bsp2: regex mit perl-code:
Code: (dl )
1
2
my $regex = 'y/;print time()';
print "ja\n" if "xyz" =~ m/x${regex}z/;


Mein Problem ist, dass beim regex-Auswerten im Bsp2 das print time() nicht ausgeführt wird :(
Irgendetwas passiert allerdings, da wenn ich eine Klammer vergesse z.B. my $regex = 'y/;print time('; bekomme ich hässlichen Fehler...

Wie kann ich also aus der Variable einen regex beenden und den nachfolgenden Perlcode ausführen?

Vielen Dank! :)
Tobias
Linuxer
 2008-02-05 01:56
#105562 #105562
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Hi,

Deine Variable $regex enthaelt einen String 'y/;print time()'. Mehr ist das für Perl nicht.
In Deiner Regex wird diese Variable interpoliert, d.h. durch ihren Inhalt ersetzt. Danach wird der Regex ausgewertet. Lässt Du nun eine Klammer beim time() weg, meldet Perl einen Fehler, weil die Klammer im Regex eine Sonderbedeutung hat. In ihrer Sonderbedeutung muss die Klammer immer paarweise auftreten! Daher die Fehlermeldung.

Für das was Du vorhast, kann ich mir im Moment keine saubere Lösung vorstellen.

Insgesamt komm ich zu drei Aussagen:

1.
Wenn man sich mal Deine Ersetzung veranschaulicht, stellt sich bereits die Frage, was dabei denn rauskommen soll. Spätestens das Kommando time()z/; wird einen Fehler generieren.

Code: (dl )
print "ja\n" if "xyz" =~ m/xy/;print time()z/; 


2.
Wenn sich Dein Begrenzer des Regex ändert, ändert sich das Verhalten wieder grundlegend und der Regex wird, selbst bei gewünschter Arbeitsweise, nicht abgebrochen.
Ein Regex muss nicht mit // begrenzt werden; es können verschiedenste Zeichen als Begrenzer auftreten; / ist dabei vielleicht das üblichste, # und ! sind auch nicht unüblich und die verschiedene Klammerungen sind auch nicht abwegig.

Code: (dl )
print "ja\n" if "xyz" =~ m{xy/;print time()z}; 


3.
Denke noch mal über dein Vorhaben/Problem nach und formuliere es neu.
Dann kann man evtl. auch sinnigere Lösungswege aufzeigen.

Greetz,
Linuxer

PS: mögliche Denk- und Formulierungsfehler sind auf die Tageszeit zurückzuführen. Gute Nacht.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
murphy
 2008-02-05 02:06
#105563 #105563
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
toby+2008-02-04 23:52:04--
[...]
Wie kann ich also aus der Variable einen regex beenden und den nachfolgenden Perlcode ausführen?
[...]


Ich hoffe doch mal, dass Perl keinen Bug hat, der so etwas sinnloses und gefährliches ermöglicht ;-) Du solltest Dir vermutlich lieber Gedanken machen, ob sich das ganze nicht anders lösen lässt -- z.B. mit Hilfe von Closures.

Wenn Du unbedingt Code innerhalb eines Regex ausführen musst, gibt es dafür die Konstrukte (?{ code }) und (??{ code }). Laut Dokumentation sind diese allerdings "[...] considered experimental, and may be changed without notice [...]". Ferner sind sie nur dann in Variablen, die in einen Regex interpoliert werden, zulässig, wenn man mit use re 'eval' Sicherheitsüberprüfungen abschaltet.
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2008-02-05 04:12
#105565 #105565
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
toby+2008-02-04 23:52:04--
habe mein kompliziertes Problem auf ein Minimum gedumpt. Dieses Minimum ergibt allerdings keinen Sinn, also nicht wundern. ;)


Diese Herangehensweise ist im Forum meist sehr löblich, weil sie die Hilfebietenden vor unwichtigen Details verschont; von daher schon mal Daumen hoch :)
Nur ist das in diesem Fall leider so, dass wir halt nichts anderes sagen koennen als "das gehoert so, das soll so sein", daher musst Du uns wohl sagen, warum Du das eigentlich machen willst, damit wir eine andere Loesung anbieten koennen.

Das mit dem Ende vom regulaeren Ausdruck ist eigentlich so wie mit einem Bullauge. Das bleibt halt, wo es ist. Wenn Du davor ein weiteres Bullauge haeltst, hast Du dann trotzdem noch kein Wasser in der Kajüte. Dafuer sieht es aber irgendwie komisch aus, da fragt sich jeder, was das fuer ein Design ist... Naja, bloeder Vergleich ;) Aber es ist wirklich kein gutes Design, Code in Variablen zu speichern.
moritz
 2008-02-05 14:17
#105571 #105571
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ich verstehe das Problem wohl auch nicht so ganz, aber könnte (?{ code }) oder (??{ code }) das gesuchte sein?
murphy
 2008-02-05 15:58
#105583 #105583
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
betterworld+2008-02-05 03:12:56--
[...]
Das mit dem Ende vom regulaeren Ausdruck ist eigentlich so wie mit einem Bullauge. Das bleibt halt, wo es ist. Wenn Du davor ein weiteres Bullauge haeltst, hast Du dann trotzdem noch kein Wasser in der Kajüte.
[...]


Für mich sah es aber eher so aus, als ob der OP eine Pumpe installieren wollte, um den Ozean durchs Bullauge ins Schiff zu befördern ;-)

Quote
Naja, bloeder Vergleich ;)


Stimmt :-P

Quote
Aber es ist wirklich kein gutes Design, Code in Variablen zu speichern.


Solange es Coderefs sind, die man speichert, ist das eigentlich eine saubere Sache -- in dieser Richtung sollte man vielleicht auch nach einer saubereren alternativen Lösung für das Problem suchen.
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2008-02-05 18:02
#105593 #105593
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
murphy+2008-02-05 14:58:17--
Quote
Aber es ist wirklich kein gutes Design, Code in Variablen zu speichern.

Solange es Coderefs sind, die man speichert, ist das eigentlich eine saubere Sache

Ich meinte jetzt Code in Textform.
toby
 2008-02-06 00:21
#105611 #105611
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

dank Euren Hinweisen habe ich das hier gefunden: http://perldoc.perl.org/perlretut.html#A-bit-of-ma...

und das ist genau das, was ich gesucht habe! :)

Vielen Dank!
Toby

PS: Ich bin nicht der Einzige mit dem Problem und Leute aus dem Forum (renee) haben schon mitgewirkt ;)

http://www.hidemail.de/blog/string-durchsuchen-arr...
moritz
 2008-02-06 00:33
#105612 #105612
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Das ist ja auch das, was ich im obigen Posting geschrieben habe...
toby
 2008-02-06 00:52
#105614 #105614
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo moritz,

ich habe ja auch geschrieben: "dank Euren Hinweisen habe ich das hier gefunden..". Das war auf jeden Fall eine Anmerkung, dass ich es Euch verdanke!

Gruß
Toby
<< >> 10 Einträge, 1 Seite



View all threads created 2008-02-05 00:52.