[Cologne-pm] PERL - schnelles suchen & ersetzen in 100MB Datei
A. Pagaltzis
pagaltzis at gmx.de
Thu Apr 29 08:38:01 CDT 2004
* Wolfgang Weisselberg <pl3rofb02 at sneakemail.com> [2004-04-29 15:11]:
> Der Code ist nicht aequivalent. Da keine Spezifikation
> ausser dem Code selber vorhanden ist, ist alles ausser einer
> Aequivalenzumformung zu dokumentieren.
>
> Vergleiche:
>
> $_ = "aabbaa";
> %replaces = ( bb => 'aa',
> aaa => 'x', );
>
> $replaces_href = \%replaces;
> foreach my $from ( keys %$replaces_href ) {
> next unless /$from/;
> s/$from/$$replaces_href{$from}/g;
> delete $$replaces_href{$from};
> }
> print $_;
>
> Bei *mir* kommt in *diesem* Falle 'xx' raus.
Bei mir nicht.
$ perl -le'print for keys %{ { bb => "aa", aaa => "x" } }'
aaa
bb
Wie hübsch. Geht's auch besser?
$ perl -le'print for keys %{ { bb => "aa", aaa => "x", foo => 1, bar => 2 } }'
bar
bb
aaa
foo
Ohh, fantastisch. Abhängig von den Ersetzungen geschehen diese in
(für Anwenderbelange) zufälliger Reihenfolge..
Nett, nicht?
> Bei deinem Code auch? Nein? Dann ist er nicht aequivalent.
Die Spezifikation war allerdings in diesem Fall nicht in sich
schlüssig.. natürlich hätte ich nicht erraten, sondern
nachfragen sollen; da muss ich dir Recht geben.
> > Verstehe ich in diesem Fall noch weniger. Warum ergibt
> > C<s/$from/.../> etwas anderes als C<s/\Q$from/.../> wenn
> > C<$from = 's1'>?
>
> Weil s1 von Lauf zu Lauf VARIABEL sein darf?
Was hat das mit der Frage zu tun? Das \Q wirkt sich nur innerhalb
eines einzelnen Laufs aus.
--
Gruss,
Aristoteles
"Wer nicht über sich selbst lachen kann, nimmt das Leben nicht ernst genug."
More information about the Cologne-pm
mailing list