Schrift
[thread]7926[/thread]

Reguläre Ausdrücke

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
tribbiani
 2006-04-26 15:40
#65347 #65347
User since
2006-01-27
17 Artikel
BenutzerIn
[default_avatar]
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.
betterworld
 2006-04-26 15:58
#65348 #65348
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
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-->
tribbiani
 2006-04-26 16:05
#65349 #65349
User since
2006-01-27
17 Artikel
BenutzerIn
[default_avatar]
[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.
docsnyder
 2006-04-26 16:10
#65350 #65350
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
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
tribbiani
 2006-04-26 16:41
#65351 #65351
User since
2006-01-27
17 Artikel
BenutzerIn
[default_avatar]
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...
Matze
 2006-04-26 17:07
#65352 #65352
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wie hast dus denn gemacht ?
Bei mir funktuioniert folgendes wubnderbar:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/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
docsnyder
 2006-04-26 17:13
#65353 #65353
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@tribbiani

Mit eval würde es so gehen:

Code: (dl )
1
2
3
4
5
6
7
8
$var   = 'aba';
$regEx = 's/a/A/g';

printf("before: $var\n");

eval("\$var =~ $regEx");

printf("after : $var\n");


Ausgabe:

Code: (dl )
1
2
before: aba
after : AbA


Wahrscheinlich hast Du

Code: (dl )
eval("$var =~ $regEx");


geschrieben statt

Code: (dl )
eval("\$var =~ $regEx");


Gruß, Doc


P.S. Ooops, habe gerade gesehen, daß Matze zeitgleich geantwortet hat ;o)\n\n

<!--EDIT|docsnyder|1146057299-->
tribbiani
 2006-04-26 17:23
#65354 #65354
User since
2006-01-27
17 Artikel
BenutzerIn
[default_avatar]
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
Dubu
 2006-04-26 20:26
#65355 #65355
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
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.
docsnyder
 2006-04-27 11:06
#65356 #65356
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
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
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2006-04-26 15:40.