Kai Diefenbach: Zeilenumbrüche

Beitrag lesen

Hallo Forum, Cheatah, Klaus

ich moechte noch mal auf das Thema "Zeilenumbrueche" zurueckkommen, das wir vor etwas laengerer Zeit hier diskutiert haben.
http://www.teamone.de/selfhtml/sfarchiv/2000_3/t17767.htm#a90288

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.

Unter Win/Dos muesste die RegExp IMHO schon auf zwei Umbrueche, sprich \015\012\015\012 matchen.

Der Grund ist m.E. folgender:

Die RegExp auf \015\012\015\012 angewandt, fuehrt _nur_ mit der ersten Alternative zu keinem Treffer.
Damit ein Treffer erzielt werden kann, wird auf die zweite bzw. dritte Alternative "ausgewichen".
Es steht also somit nur \015\012\015 in $1.

Allerdings verhaelt sie nicht auf diese Art, sondern so wie gewollt.

Wenn ich allerdings '\015' mit 'a' und '\012' mit 'b' ersetze, verhaelt sie sich so, wie ich es erwarten wuerde.

Mit folgenden Skripten kann man das nachvollziehen:

<Skript1>

#!perl -w

use strict;
undef $/;
my $text = <DATA>;
my $umbruch = '(\015\012\015\012)';
print "matched\n" if $text=~ s/($umbruch{2})$umbruch+/$1/g == 1;
__DATA__
eins

zwei
</Skript1>

Gibt nix aus.

<Skript2>
#'\015' mit 'a' und '\012' mit 'b' ersetzt
#!perl -w
use strict;
my $text = 'einsababzwei';
my $umbruch = '(abab)';
print "matched\n" if $text=~ s/($umbruch{2})$umbruch+/$1/g == 1;
</Skript2>

Gibt 'matched' aus.

Kann mir jemand erklaeren, warum das so ist ?

Gruss
   Kai