www.mucker.at http://www.mucker.at Helmut Mucker de Über's Holzschnitzen und Textschnitzen http://www.mucker.at/2008//07#textsplit <!-- amazon-search: Perl --> <!-- amazon-mode: books-de --> <!-- asin:3446223096 --> <!-- 3446223096 --> <a href="http://www.amazon.de/gp/product/3446223096?tag=mucker-at21&link_code=xm2&camp=2025&dev-t=D2XXWVEZNTS1N5"><img class="border alignleft" height="110" alt="" src="http://images-eu.amazon.com/images/P/3446223096.03._BO2,204,203,200_PIsitb-dp-500-arrow,TopRight,45,-64_AA240_SH20_OU03_SCLZZZZZZZ_.jpg" /></a> <p> "So wie der Schreiner das Holz bearbeitet, bearbeiten pragmatische Programmierer Text", schreiben Andrew Hunt und David Thomas in ihrem bekannten Buch "Der Pragmatische Programmierer". <!-- (amazon_textlink:3446223096). --> Mit mächtigen Scriptsprachen mit Fähigkeiten zur effizienten Textbearbeitung und mit regulären Ausdrücken ist es gar nicht schwer, "wie mit der Fräsmaschine" über Texte herzufallen. Dazu ein keines Beispiel mit perl: : <br><br> Ein Text soll in Stücke "gehauen" werden. jedes Stück soll nicht länger als 130 Zeichen sein, und es sollen keine Wörter zertrennt werden. Diese Beispiel ist nicht aus der Luft gegriffen,sondern stammt aus einem E-Mail/SMS Gateway, programmiert mit perl und <a href="www.gnokii.org">gnokii</a>, dem GNU Nokia Toolkit. <br><br> In der ersten Zeile wird eine als Parameter übergebene Datei, oder bei deren Abwesenheit alles was von <tt>STDIN</tt> kommt, in die Variable <tt>$input</tt> eingelesen. <br><br> <!-- asin:3800143887 --> Daran anschließend wird der Text dann entsprechend der oben spezifizierten Regeln aufgespalten. Dank der mächtigen regulären Ausdrücke in perl ist dies in einer einzigen Zeile möglich: Der Ausdruck <tt>.{1,130}\s</tt> passt auf jedes Stück Text, welches aus beliebigen Zeichen besteht, zwischen einem und hundertdreißig Zeichen lang ist, und mit einem Leerzeichen aufhört. Alle so gefundenen Stücke werden von perl "automagisch" an ein Array <tt>@splitted</tt> übergeben. <br><br> Am Ende wird dann alles in einer kleinen Schleife ausgegeben. <br><br> <pre> #!/usr/bin/perl my $input = join ("",<>); my @splitted = $input =~ m/.{1,130}\s/gs; foreach(@splitted) { print $_ . "\n" . "-" x 60 . "\n"; }; </pre> Füttert man das Programm mit dem folgenden Beispieltext (Aus der <tt>xskat(6)</tt> man page) Text <pre> Jeder Spieler, beginnend mit Vorhand, darf den Skat aufnehmen und 2 Karten verdeckt weitergeben. Es ist nicht erlaubt, Buben zu schieben. Der Spielwert wird verdoppelt für jedes Mal, das ein Spieler den Skat nicht aufnimmt. Spiele keinen Schieberamsch (Voreinstellung). Am Ende des Ramschspiels geht der Skat an den(die) Verlierer, wodurch sich der Verlust erhöht. Der Skat geht an den Gewinner des letzten Stichs (Voreinstellung). Er- laube den Gegnern 'Kontra' zu sagen, was den Wert des Spiels ver- doppelt. Der Alleinspieler kann mit 'Re' antwortet, was eine weitere Verdoppelung bewirkt. Verbiete Kontra (Voreinstellung). Nur ein Gegner der wenigstens 18 gesagt hat, darf 'Kontra' sagen. Spiele eine Bock-Runde nach einem besonderen Ereignis. Der Spielwert der folgenden 3 Spiele wird verdoppelt. Wenn innerhalb einer Bock-Runde ein weiteres Bock-Ereignis eintritt oder mehrere Bock-Ereignisse gleichzeitig geschehen, wird die entsprechende Zahl Bock-Runden zusätzlich gespielt. Spiele keine Bock-Runden (Voreinstellung). Spiele eine Runde Ramsch nach jeder Bock- Runde. Bevor ein Ramsch beginnt, darf jeder Spieler, beginnend mit Vorhand, erklären, ob er lieber Grand Hand spielen will. Nach einem Grand Hand gibt derselbe Spieler nochmal, weil dieses Spiel nicht zu den 3 Spielen der Ramsch-Runde zählt. </pre> so liefert es dieses Ergebnis: <pre> Jeder Spieler, beginnend mit Vorhand, darf den Skat aufnehmen und 2 Karten verdeckt weitergeben. Es ist nicht erlaubt, Buben zu ------------------------------------------------------------ schieben. Der Spielwert wird verdoppelt für jedes Mal, das ein Spieler den Skat nicht aufnimmt. Spiele keinen Schieberamsch ------------------------------------------------------------ (Voreinstellung). Am Ende des Ramschspiels geht der Skat an den(die) Verlierer, wodurch sich der Verlust erhöht. Der Skat geht an ------------------------------------------------------------ den Gewinner des letzten Stichs (Voreinstellung). Er- laube den Gegnern 'Kontra' zu sagen, was den Wert des Spiels ver- doppelt. ------------------------------------------------------------ Der Alleinspieler kann mit 'Re' antwortet, was eine weitere Verdoppelung bewirkt. Verbiete Kontra (Voreinstellung). Nur ein Gegner ------------------------------------------------------------ der wenigstens 18 gesagt hat, darf 'Kontra' sagen. Spiele eine Bock-Runde nach einem besonderen Ereignis. Der Spielwert der ------------------------------------------------------------ folgenden 3 Spiele wird verdoppelt. Wenn innerhalb einer Bock-Runde ein weiteres Bock-Ereignis eintritt oder mehrere ------------------------------------------------------------ Bock-Ereignisse gleichzeitig geschehen, wird die entsprechende Zahl Bock-Runden zusätzlich gespielt. Spiele keine Bock-Runden ------------------------------------------------------------ (Voreinstellung). Spiele eine Runde Ramsch nach jeder Bock- Runde. Bevor ein Ramsch beginnt, darf jeder Spieler, beginnend mit ------------------------------------------------------------ Vorhand, erklären, ob er lieber Grand Hand spielen will. Nach einem Grand Hand gibt derselbe Spieler nochmal, weil dieses Spiel ------------------------------------------------------------ nicht zu den 3 Spielen der Ramsch-Runde zählt. ------------------------------------------------------------ </pre> <!-- asin:3518396889 --> Nichts als "saubere Schnitte" sozusagen. Einige Nacharbeiten mit "feinerem Schleifpapier" wie zum Beispiel das Entfernen mehrfacher Leerzeichen oder der Zeilenumbrüche sind hier allerdings noch erforderlich. <br clear="all"> <br> <!-- Hier gibt's zum Abschluß noch einige "hölzerne" links: <br><br> amazon_textlink:3446223096 <br> amazon_textlink:3800143887 <br> amazon_textlink:3518396889 </p>