[Cologne-pm] PERL - schnelles suchen & ersetzen in 100MB Datei
A. Pagaltzis
pagaltzis at gmx.de
Wed Apr 28 11:02:04 CDT 2004
* cem.sakaryali at easi.de <cem.sakaryali at easi.de> [2004-04-28 17:15]:
> Ich wollte die Ausgabe in eine Datei umleiten
> B steht fuer
> open (B,"<out.txt");
Du öffnest eine Datei, in die du schreiben willst, zum Lesen?
Es ist ohnehin flexibler, das per Ausgabeumleitung zu machen und
sich im Skript nicht drum zu kümmern.
> Da hatte ich die Idee:
> print B, next unless $matches and m/$matches/;
>
> zu screiben, aber perl hat mit
> "No comma allowed after filehandle at codes.pl line 85"
> dies angemeckert.
Ah. Da wird es als
print(B, next) unless $matches and m/$matches/;
verstanden. Schreib es explizit als
print(B, $_), next unless $matches and m/$matches/;
> Bei deinem Code:
>
> Hatte ich folgende Ausgabe:
> output file:
> fsdlkgjd;gjdglsdfs;lk;lsksddl;fsk;s
> fsdlkgjd;gjdgls2dfs;lk;ls2ksddl;fsk;s2
> fsdlkgjd;gjdgls3dfs;lk;ls3ksddl;fsk;s3
> fsdlkgjd;gjdglsdfs;lk;lsksddl;fsk;s
>
>
> input war:
> fsdlkgjd;gjdgls1dfs;lk;ls1ksddl;fsk;s1
> fsdlkgjd;gjdgls2dfs;lk;ls2ksddl;fsk;s2
> fsdlkgjd;gjdgls3dfs;lk;ls3ksddl;fsk;s3
> fsdlkgjd;gjdgls1dfs;lk;ls1ksddl;fsk;s1
>
>
> also ist etwas mit dem Erzaetzen schief gegangen?
Ah. Nein, das kompilieren ging daneben, ich habe map() in
skalarem Kontext verwendet.. so wird es klappen:
sub rx_from_list { my $rx = join '|', map quotemeta, @_; qr/($rx)/ }
> Somit habe ich ein mix von euren Vorschlaegen gemacht.
>
> > my $matches = join( '|', keys %ERSETZHALTER );
quotemeta fehlt.
> > qr/$matches/;
Willst du das nicht irgendwo speichern?
> > while (<A>) {
> > s[ $matches ][ $ERSETZHALTER{$&} ]xge;
Warum $& ? Warum /e ?
> > print B;
> > }
my $matches = do {
my $rx = join( '|', map quotemeta, keys %ERSETZHALTER );
qr/($rx)/;
};
while (<A>) {
s/$matches/$ERSETZHALTER{$1}/g;
print B;
}
--
Gruss,
Aristoteles
"Wer nicht über sich selbst lachen kann, nimmt das Leben nicht ernst genug."
More information about the Cologne-pm
mailing list