Jörk Behrends: Umbrüche in Formular umsetzen

Beitrag lesen

$text =~ s/(.{0,10}\w)\s/$1\n/g;

der Ansatz war schon ganz gut, allerdings musste ich es etwas abändern:

$in{text} =~ s/(.{1,80}[a-zA-Z:,0-9öüä\s])\s/$1\n/g;
    $in{text} =~ s/\n\n/\n/g;

die erste Zeile berücksichtigt, das z.B. auch ein Doppelpunkt vorkommen könnte.

Ich hatte das \w eingesetzt, damit der Text, der zu einer Zeile wird, nicht mit einem Space endet. Besser wäre da vielleicht ein \S gewesen ...
Ansonsten bezog sich \w nur auf das letzte Zeichen in der Zeile. Wenn Du das letzte Zeichen beliebig gestalten möchtest, so kannst Du auch /(.{1,81})\s/ benutzen.

Außerdem das eine Zeile nicht bis zum Ende ausgeschrieben sein kann. Der Text
wär somit ok, wenn man das Skript lokal ausführt, schickt man das ganz jedoch
mit sendmail, dann wird aus einer Leerzeile eine doppelte Leerzeile (weiss jemand warum?)

Das sollte wohl an Deiner Variation liegen. Insbesondere das \s in der eckigen Klammer bringt
hier die Verwirrung. Im Gegensatz zum '.' kann \s auch ein Return matchen ...
Bsp:
$text =  "12 3 4 5\n 6 7 8";
$text =~ s/(.{1,4}[a-zA-Z:,0-9öüä\s])\s/$1\n/g;

dann wird $text zu
"12 3\n4 5\n\n6 7 8"

mit
$text =~ s/(.{1,4}\S)\s/$1\n/g;
erhält man
"12 3\n4 5\n 6 7\n8"

Daher noch  $in{text} =~ s/\n\n/\n/g; um die Doppelleerzeile in eine Einfachleerzeile zu konvertieren.

Wird dann hoffentlich hinfällig.

Jörk