Jörk Behrends: Zeilenumbrüche

Beitrag lesen

Hallo Kai,

Frage war damals wie man mehrfache Zeilenumbrueche (>2) filtert.
Cheatah kam auf folgende Loesung:

my $umbruch = '(\015\012\015\012)';
s/($umbruch{2})$umbruch+/$1/g;

welche auch funktioniert : )

Allerdings frage ich mich mittlerweile warum.

»»

Mit folgenden Skripten kann man das nachvollziehen:

<Skript1>
[...]

hast Du evtl. mal geschaut, was den so in $text steht?

$text =~ s/(.)/sprintf('%#o',ord($1))/seg;
print $text;

zeigt mir jedenfalls, daß Perl beim einlesen von Textdateien automatisch aus einm \015\012 ein \012 macht. In deinem Text steht also nur \012\012 - und da funktioniert die RegExp auch. Wenn Du jedoch per "binmode DATA;" diese Konvertierung abschaltest ...

Wo Du die Dateien schon so einliest, hast Du es eigentlich mal mit "$/ = '';" probiert? Hier werden automatisch beim einlesen mehr als zwei Zeilenumbrüche auf zwei Reduziert. Ansonsten wird der Text sozusagen Absatzweise eingelesen.

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.

Viel Spaß,
   Jörk