[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