[vienna.pm] Suchen und ersetzen...

Marcel Grunauer marcel at codewerk.com
Tue Jun 13 14:24:52 CDT 2000


* * * vienna-pm-list * * *


On Tue, 13 Jun 2000, Peter Seitz wrote:

> * * * vienna-pm-list * * *
> 
> 
> Hallo Freunde,
> 
> ich habe hier ein Unterprogramm, welches mir aus einer Eingabezeile
> einen Text extrahiert. Jetzt wuerde ich noch gerne uebergeben, dass
> eine bestimmte Zeichenfolge durch eine andere Zeichenfolge uebergeben
> wird. Ich habe also folgendes im Unterprogramm geschrieben:
> 
>   my ($inputline,$find,$replace) = @_;
>   match = "extrahierter String";
> #   eval "(\$match =~ s/$find/$replace/g)";
> #   $match =~ s/$find/$replace/g;
>     $match =~ s/\\"/$replace/g;
>     $match =~ s/""/$replace/g;
> 
> 
> Im Hauptprogramm steht:
> 
>       $docinfo[4] = extract_string($docinfo[4], "\\\"", "\"");
> 
> d.h ich moechte die Zeichenfolge _\"_ durch _"_ ersetzen.

Wenn Du statt der double quotes lieber single quotes als delimiter
verwendest, ersparst Du Dir einige backslashes:

	'\\"'
	'"'

> 
> Komischerweise hat das s/$find/$replace/g nicht funktioniert, obwohl
> die Werte richtig im Unterprogramm ankommen. Auch mit eval habe ich es
> nicht geschafft, obiges Problem zu erschlagen.

Weil nach dem Ersetzen der Variablen in der regex in Wirklichkeit dann
folgendes steht:

	$match =~ s/\"/"/g;

d.h. Du ersetzt ein double quote durch ein double quote.

> Ich wuerde mir auch wuenschen, dass ich mehrere Zeichenfolgen eingeen
> kann, da ich auch ein _""_ durch _"_ erstzen moechte. Also fuer $find
> die Eingabe "(\\\"|\"\")".

Fuer dieses und das obige Problem gibts in Perl nunmehr den qr-Operator.

perldoc perlop

       qr/STRING/imosx
               This operators quotes--and compiles--its STRING as
               a regular expression.  STRING is interpolated the
               same way as PATTERN in `m/PATTERN/'.  If "'" is
               used as the delimiter, no interpolation is done.
               Returns a Perl value which may be used instead of
               the corresponding `/STRING/imosx' expression.

               For example,

                   $rex = qr/my.STRING/is;
                   s/$rex/foo/;

               is equivalent to

                   s/my.STRING/foo/is;

Also:

	#!/usr/bin/perl -w

	use strict;

	my $input   = q(" "anfang"" mitte\\"ende\\");
	my $find    = qr/(\\"|"")/;
	my $replace = '"';

	$input =~ s/$find/$replace/g;

	print $input;

Ergebnis:

	" "anfang" mitte"ende"

-- 
Marcel
perl -e 'print unpack(q$u$,q$82G5S="!!;F]T:&5R(%!E<FP at 2&%C:V5R$)'

###
You are subscribed to vienna-pm-list as Marcel Grunauer <marcel at codewerk.com>
http://www.fff.at/fff/vienna.pm/



More information about the Vienna-pm mailing list