User since
2006-01-27
17
Artikel
BenutzerIn
Hallo,
kann man einen regulären Ausdruck auch als Variable übergeben?
Beispiel:
use strict;
use warnings;
my $string = '48000';
my $regex = 's/...$//';
print "org string: $string\n";
$string =~ $regex;
# statt
# $string =~ s/...$//;
print "new string: $string\n";
sollte auch 48 als string liefern.
User since
2003-08-21
2614
Artikel
ModeratorIn
Ja, man kann einen regulaeren Ausdruck auch als Variable uebergeben. Aber 's/...$//' ist kein regulaerer Ausdruck.
...$ ist ein regulaerer Ausdruck. Du kannst ihn mit
my $regex = qr/...$/ in einer Variablen speichern, um ihn später mit
$string =~ s/$regex// zu benutzen.\n\n
<!--EDIT|betterworld|1146052734-->
User since
2006-01-27
17
Artikel
BenutzerIn
[quote=betterworld,26.04.2006, 13:58]Ja, man kann einen regulaeren Ausdruck auch als Variable uebergeben. Aber 's/...$//' ist kein regulaerer Ausdruck. ...$ ist ein regulaerer Ausdruck. Du kannst ihn mit my $regex = qr/...$/ in einer Variablen speichern, um ihn später mit $string =~ s/$regex// zu benutzen.[/quote]
Sorry,
ich hab mich vielleicht falsch ausgedrückt, ich will aber den ganzen "search and replase" Teil als Variable Übergeben. Geht das? Die Variable $regex wird auch von einem anderen Modul übergeben, ich hab in dem Beispiel das Ganze "etwas" verkürzt.
User since
2005-09-08
300
Artikel
BenutzerIn
Mit eval() würde es gehen, aber sauberer ist es, wenn Du das "pattern" und das "replace" beides als Parameter übergibst (ist auch flexibler).
Gruß, Doc
User since
2006-01-27
17
Artikel
BenutzerIn
Zuerst danke für die Tips!
Aber mit eval() ging es auch nicht...
Vielleicht hab ich es nicht richtig eingesetzt, bin ja auch Perl Neuling...
User since
2005-08-29
222
Artikel
BenutzerIn
Wie hast dus denn gemacht ?
Bei mir funktuioniert folgendes wubnderbar:
#!/usr/bin/perl -w
#
use strict;
my $string = 48000;
my $regex = 's/...$//;';
eval("\$string =~ $regex");
print "STRING: $string\n";
# Gibt 48 aus
MfG. Matze
Mit freundlichen Grüßen: Matze
User since
2005-09-08
300
Artikel
BenutzerIn
@tribbiani
Mit eval würde es so gehen:
$var = 'aba';
$regEx = 's/a/A/g';
printf("before: $var\n");
eval("\$var =~ $regEx");
printf("after : $var\n");
Ausgabe:
Wahrscheinlich hast Du
geschrieben statt
Gruß, Doc
P.S. Ooops, habe gerade gesehen, daß Matze zeitgleich geantwortet hat ;o)\n\n
<!--EDIT|docsnyder|1146057299-->
User since
2006-01-27
17
Artikel
BenutzerIn
Danke! especially to docsnyder and Matze.
mit: eval("\$var =~ $regEx");
geht's wunderbar :)
Richtig geraten, ich hab immer wieder den backslash vergessen:
eval("$var =~ $regEx");
Grüsse,
tribbiani
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
Da man sich beim String-eval gerne mal in den Fuß schießt, sei mir die Frage erlaubt: Warum ist es in deiner Anwendung erforderlich, den ganzen Ausdruck zu übergeben? Warum reicht nicht die Regex?
Wenn eine eval-Lösung funktioniert, dann ist das erfreulich, aber es handelt sich IMHO sehr häufig um eine (ziemlich wacklige und unsichere) Notlösung, weil einem gerade nichts besseres einfällt. Wenn du das Problem näher beschreibst, fällt uns ja vielleicht noch eine bessere, stabilere, und vor allem sicherere Lösung ein.
User since
2005-09-08
300
Artikel
BenutzerIn
Ich stimme Dubu zu: ich würde auch nur den Regex und ggf. das Replacement übergeben und evals vermeiden wenn immer es geht. Also: dann beschreibe doch, mal Dein Problem.
Gruß, Doc