[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