perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5310
davon online: 1
weitere User: 26
Click for quality!




10.09.2010 / 05:29

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragMaskieren in Replacefunktion??
Seitenanfang
Hallo,

Ich habe gerade angefangen, mich mit Perl zu beschäftigen und bin auf folgendes Problem gestossen, welches ich bisher leider nicht lösen konnte:

Ziel ist es folgende zeile in einem Bash-Skript durch "blablabla" zu ersetzen:

save ${i}

Mein Perlskript sieht folgendermaßen aus:

--------------------------
my $rw = open(JOBTEMPLATE, "Bashjob_orig");
if(not defined($rw)) {
die "ERROR OPENING FILE: $!\n";
}
open(OPTIMIZEJOB,"> BashjobPERL")
or die "ERROR OPENING FILE: $!\n";

$g1= "save \$\{i\}";
$g3="blablabla";

while(defined(my $i = <JOBTEMPLATE>)) {
$i =~ s/$g1/$g3/ ;
print OPTIMIZEJOB $i ;
}

close(JOBTEMPLATE);
close(OPTIMIZEJOB);
---------------------------------

Das Problem ist, daß ich ${i} nie ersetzt bekomme.
Die Ersetzung von $ oder { alleine geht.

Ich vermute, daß problem liegt an der Maskierung innerhalb des "$i =~ s/$g1/$g3/ ;" Befehls!

Wäre toll, wenn mir jemand nen Tipp geben könnte!

Tschüß,
Philipp

Datum: 23.01.2008-10:21

Beitragre: Maskieren in Replacefunktion??
Seitenanfang
Es gibt zwei Moeglichkeiten zur Loesung des Problems (oder auch mehr).

Du setzt dein Suchmusterstring in einfache Anfuehrungszeichen, dann werden den Backslashes naemlich keine Sonderbedeutung zugeordnet (bis auf \' und \\).

So enthaelt $g1 bei doppelten Anfuehrungszeichen


$g1= "save \$\{i\}";

nach der Zuweisung nicht den String 'save \$\{i\}' sondern 'save ${i}', welches als Suchmuster in den Regexp wiederum interpoliert wird, so wird ${i} mit den Inhalt von $i ersetzt.

Hingegen enthaelt $g1 bei einfachen Anfuehrungszeichen


$g1= 'save \$\{i\}';

das was du wuenscht, naemlich 'save \$\{i\}'.

Da diese 'Escape'erei jedoch unleserlich und fehleranfaellig ist, hat Perl dafuer eine Funktion quotemeta(), dabei wird alles escapet was kein Wortzeichen ist.


$g1 = quotemeta('${i}'); # wird zu --> \$\{i\}

Wichtig ist hierbei wieder die Verwendung der einfachen Anfuehrungszeichen damit ${i} nicht zuvor durch den Inhalt von $i ersetzt wird.

Eine weitere Moeglichkeit ist die Verwendung der Escapesequenzen \Q und \E direkt im doppelt-quotierten String, wird dadurch aber auch nicht lesbarer.


$g1 = "\Qsave \$\{i\}\E"; # haesslich

HTH

Datum: 23.01.2008-22:03

Beitragre: Maskieren in Replacefunktion??
Seitenanfang
Eine weitere Möglichkeit (und meiner Meinung nach die Beste) ist das "quotemeta" direkt im RegEx:

my $re = 'save ${i}';
$string =~ s/\Q$re\E/irgendwas/g;

Datum: 24.01.2008-12:52

Beitragre: Maskieren in Replacefunktion??
Seitenanfang
Vielen Dank für eure Antworten, ihr habt mir sehr weitergeholfen!

Habt ihr vielleicht einen Link zu einem Tutorial in dem solche (Syntax)-Sachen kurz behandelt werden?

lg,
Philipp

Datum: 25.01.2008-09:04

Beitragre: Maskieren in Replacefunktion??
Seitenanfang
http://perldoc.perl.org/perlretut.html
http://perldoc.perl.org/perlrequick.html
http://perldoc.perl.org/perlreref.html

Eine allgemeine Abhandlung über RegEx ist unter http://regenechsen.de zu finden.

Datum: 25.01.2008-13:00

-






-
-