Jörk Behrends: Zeilenumbrüche

Beitrag lesen

Hallo Jörk, ;-)

Noch ein kleiner Nachtrag:

Möchtest Du hingegen einen Text aus einer Variablen bearbeiten, so solltest Du folgendes verwenden:
print "matched\n" if $text=~ s/($umbruch)\1{2,}/$1$1/g == 1;

Durch die Referenz auf die erste Klammer wird die Art und Weise festgehalten, wie eine einzele Zeilenschaltung aufgebaut ist. Dies muß dann mindestens noch zwei weitere male auftreten. Ist dies der Fall so soll nur zweimal die Zeilenschaltung übrig bleiben.

Mag ja sein, daß man durchaus mal Zeilenschaltungen aus unterschiedlichen Systemen in seinem Text hat. Demzufolge wäre mein Ansatz doch etwas sehr einschränkend :( Bevor man jetzt aber denn Weg geht, alle \r heraus zu schmeißen bzw. in ein \n zu wandeln:
print "matched\n" if $text=~ s/($umbruch{2})$umburch+/$1/g == 1;

Uups, kennen wir doch schon! Richtig die Änderung liegt ja auch in $umbruch:
my $umbruch = '(?>\015\012\015\012)';

Hierdurch entfällt das Backtracking-Problem: Eine einmal festgelegte Zeilenschaltung (also eine der drei Möglichkeiten aus $umbruch) wird nicht wieder geändert! Wurde also z.B. \015\012 zweimal in \015\012\015\012 gefunden, so wird hinterher nicht versucht, für den zweiten Treffer nur \015 zu verwenden, so daß \012 als vermeindliche dritte Zeilenschaltung verwendet werden könnte.

Gruß,
   Jörk