Jag byggde vidare på regexp-exemplet från Bengt och kan nu erbjuda nedanstående förslag. Eftersom jag är så gott som nybörjare på Perl så skall mitt exempel tas som ett algoritmförslag och kompletteras med felhantering och liknande. Dessutom har jag säkert missat något undantagsfall. Det verkar i alla fall fungera med den medföljande texten utökad med enstaka instanser av mina undantag.
mvh Tommy Riboe
#============================================ #!/bin/perl # # huvudregel: # a) rader vars sista ord slutar med '-' bryts före avstavat ord # b) avstavat ord sammanfogas på nästa rad # c) indrag bibehålles # # undantag: # a) rad som slutar med tankstreck (ensamt '-') # b) rad som slutar med förled i upprepade sammansatta ord # c) avstavning i sidans sista rad # # vid undantag b) flyttas förledet till följande rad
seek(STDIN, 0, SEEK_SET); $line= ""; $nextline= ""; $spill = "";
#if (<STDIN>) { # läs in första raden $line = <STDIN>; { # avlägsna ord som slutar med bindestreck från # slutet av raden, med undantag för ensamma # bindestreck, placera avlägsnad text i $spill $line =~ s/(\s*)(.*)( +?)(\S+?)-$/\1\2/; $spill = $4; } print $line;
while (<STDIN>) {
# testa om nästa rad börjar med "och", "eller" # (bör mer naturligt placeras efter nästa sats # och använda sig av $nextline) if (/^\s*(och|eller).*$/) { $spill = $spill . "- "; }
# förbered nästa rad $nextline = $_;
# sätt ihop marginal + spill + nästa_rad $nextline =~ s/(\s*)(.+?)$/$1$spill$2/;
# gör nästa rad till aktuell rad $line = $nextline;
# avlägsna ord som slutar med bindestreck från # slutet av raden, med undantag för ensamma # bindestreck, placera avlägsnad text i $spill $line =~ s/(\s*)(.*)( +?)(\S+?)-$/\1\2/; $spill = $4; print $line; } #} print "\n(till nästa sida: " . $spill . ")\n"; #============================================
-----Ursprungligt meddelande----- Från: runeberg-admin@lists.lysator.liu.se [mailto:runeberg-admin@lists.lysator.liu.se]För Bengt J. Olsson Skickat: den 27 januari 2004 00:00 Till: runeberg@lists.lysator.liu.se; Hans Persson Ämne: [Runeberg] Re: [Runeberg] Vill du hjälpa Projekt Runeberg programmera?
Har inte något färdigt program men har följande brott-stycke av ett sånt program;
<för varje rad>
$line =~ s/(.*) (.+?)-$/$1/;
<matchar om sista tecknet på raden är "-"; allt utom det avstavade ordet finns kvar i $1; första delen av det avstavade ordet finns i $2>
<nästa rad om matchningen lyckades>
$line = $2 . $line;
<konkatenerar början av det avstavade ordet med nästa rad>
M v h Bengt
Bengt J. Olsson bengt@blafs.com http://blafs.com