Schrift
[thread]5964[/thread]

Probleme mit RegEx suchen/ersetzen mit Variablen

Leser: 5


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Gast Gast
 2003-12-11 12:15
#75537 #75537
Hallo,
Ich hab da ein kleines Problemchen.
Ich möchte in einem String suchen und ersetzen, wobei der Such- bzw. der Ersetzstring in Variablen gespeichert ist.
Hier hab ich mal ein Beispiel:

$String = 'Kuckst Du hier';
$Suchen = '(Kuckst)( Du )(hier)';
$Ersetzen = '$3$2$1';
if($String =~ s/$Suchen/$Ersetzen/)
{
 print "$String";
}

Die Ausgabe lautet "$3$2$1" anstatt "hier Du Kuckst".
Ich stehe irgendwie auf dem Schlauch. Wenn jemand 'ne Lösung hat wär da echt klasse.

Gruß Ansgar
format_c
 2003-12-11 12:35
#75538 #75538
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
OK nach ein paar test mit dem e-Flag und eval die zu keinem Ergebnis geführt haben, hier meine alternativ ansatz:
Code: (dl )
1
2
3
4
5
6
7
8
$String = 'Kuckst Du hier';
$Suchen = qr'(Kuckst)( Du )(hier)';
if($String =~ s/$Suchen/$3$2$1/)
{
print "$String";
}
_ _ END _ _
hier Du Kuckst


Ist das so OK
Gruß Alex\n\n

<!--EDIT|format_c|1071139024-->
Ansgar
 2003-12-11 12:56
#75539 #75539
User since
2003-12-11
3 Artikel
BenutzerIn
[default_avatar]
Hi format_c,

nein, das geht leider nicht, ich ja auch den Ersetzen-String in
einer Variablen haben möchte.
Vielleicht schweife ich einfach mal ein bischen aus.
Ich möchte eine subroutine schreiben, die in einer Datei nach Zeilen sucht und diese ersetzt. Dazu übergebe ich der subroutine einen Hash mit suchen=>ersetzen werten.
Es wird dann in jeder eingelesenen Datei-Zeile alle Hash suchen=>ersetzen paare angewendet.
Deshalb brauche genaugenommen folgendes:
   foreach $PMSearchString(keys(%PatMatchStr))
   {
     if($Line =~ s/$PMSearchString/$PatMatchStr{$PMSearchString}/g)
     {
       print $Line;
     }
   }

wobei Line die aktuelle Zeile der Datei und %PatMatchStr der suchen=>ersetzen Hash ist.

Gruß Ansgar
Crian
 2003-12-11 13:51
#75540 #75540
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Da RE's mit externen Variablen sehr langsam sind, würde ich statt suchen/ersetzen der Funktion gleich die RE übergeben.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ansgar
 2003-12-11 13:59
#75541 #75541
User since
2003-12-11
3 Artikel
BenutzerIn
[default_avatar]
So wollte ich es am Anfang machen. Es hat jedoch nicht funktioniert.

$String = 'Kuckst Du hier';
$RegExString = 's/(Kuckst)( Du )(hier)/$3$2$1/';
if($String =~ $RegExString)
{
print $String;
}

Da bekome ich überhaupt keine Ausgabe.
Oder mache ich in dem Beispiel irgend etwas falsch?

Gruß Ansgar
Crian
 2003-12-11 14:25
#75542 #75542
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
So gehts:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
use strict;
use warnings;

my $String = 'Kuckst Du hier';
my $Suchen = '(Kuckst)( Du )(hier)';
my $Ersetzen = '$3$2$1';


my $RE = "s~$Suchen~$Ersetzen~";

print "RE : '$RE'\n";
print "String: '$String'\n";

$_ = $String;
eval $RE;
$String = $_;

print "String: '$String'\n";


Ausgabe:

Code: (dl )
1
2
3
RE    : 's~(Kuckst)( Du )(hier)~$3$2$1~'
String: 'Kuckst Du hier'
String: 'hier Du Kuckst'
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2003-12-11 14:30
#75543 #75543
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
[quote=Ansgar,11.12.2003, 12:59]So wollte ich es am Anfang machen. Es hat jedoch nicht funktioniert.

$String = 'Kuckst Du hier';
$RegExString = 's/(Kuckst)( Du )(hier)/$3$2$1/';
if($String =~ $RegExString)
{
 print $String;
}

Da bekome ich überhaupt keine Ausgabe.
Oder mache ich in dem Beispiel irgend etwas falsch?

Gruß Ansgar[/quote]
Das geht analog zu oberem so:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
use strict;
use warnings;

my $String = 'Kuckst Du hier';
my $RegExString = 's/(Kuckst)( Du )(hier)/$3$2$1/';

$_ = $String;
if ( eval $RegExString ) {
$String = $_;
print $String;
}


Ausgabe:

Code: (dl )
hier Du Kuckst
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ansgar
 2003-12-11 14:56
#75544 #75544
User since
2003-12-11
3 Artikel
BenutzerIn
[default_avatar]
Klasse!

Jetzt hat's geklappt.
Das "eval $RegExString" war der Knotenlöser. Was ein so kleines eval doch alles zu leisten vermag. z.B. einen halben Tag Sucherei, elende Fluchereien, viel Tipparbeit, leserei, ...
Aber doch wenigstens zum Schluß Befriedigung, wenn's klappt.

Vielen Dank an alle!!
Strat
 2003-12-11 15:08
#75545 #75545
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
vielleicht hilft auch perlop -> qr weiter
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2003-12-11 15:15
#75546 #75546
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
dem eval 's///' würde ich dann doch eher s///ee vorziehen. je nachdem,
woher der input kommt, muss man aber auch noch in diesem fall vorsichtig
sein.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2003-12-11 12:15.