Hartmut Camphausen | Kirchstr. 8 | 35043 Marburg | Fon: 06424/923826 | Fax: 06424/923827 | Emil: h.camp@creagen.de |
ESplit.pm -
|
[Beschreibung] | [Verwendung] | [Installation] | [Feinheiten] | [Version] | [Copyright] | [Autor] |
ESplit.pm stellt die Funktion e_split()
bereit, mit der man Skalare (Quellstrings) an beliebigen Zeichen(-ketten) (Trennern) in Teilstrings (Tokens) zerlegen kann. Der Trenner kann auch als regulärer Ausdruck gegeben werden (ohne /../
bzw. m#..#
!)
Teilstrings, die in einfachen oder doppelten Anführungszeichen stehen, werden nicht auf Trenner untersucht. Weiters werden Trenner, denen ein Backslash ( \ ) vorangestellt wurde, ignoriert.Bei Bedarf liefert e_split() maximal n Elemente zurück, vom Anfang des Quellstrings (mit n > 0) oder vom Ende des Quellstrings (n < 0) her betrachtet.@tokens = e_split (parameter) $tokens_ref = e_split (parameter) parst den Quellstring und liefert einen Array der gefundenen Teilstrings. - Parameter: [$separator] [, $quellstring] [, [-]$num_of_elems_to_return] [, $flags]
Hier in eckigen Klammern notierte Parameter sind optional.
Trenner-RE: . liefert leeren Array (wie split) '' (Leerstring) liefert jedes Zeichen (wie split) (Häkchen sind normale Zeichen) '()' (Leerstring in Klammern) liefert jedes Zeichen, plus dieses als Trenner (Häkchen sind normale Zeichen) undef trennt an Leerzeichen (\s+) (wie split) (Häkchen werden als Stringumschließer\Escaper interpretiert) CAVE: Evaluiert die Trenner-RE zu einem Leerstring (bspw. '.*'), läuft e_split ziemlich lange :-( Wird e_split ohne alles aufgerufen, trennt es $_ an \s+ auf. Bei gegebenem Parameter #2 wirkt RE = undef wie RE = "\s+". Soll e_split eine bestimmte Anzahl von Feldern extrahieren (Parameter #3), werden diese in aufsteigender Folge geliefert. $Ergebnisarray[-1] enthält gegebenenfalls den Reststring. Bei negativem Parm #3 wird der Ergebnisarray *nicht* auf den Kopf gestellt (das überlassen wir dem geneigten User). Der Reststring findet sich gegebenenfalls in $Ergebnisarray[0]. Standardmäßig werden feldumschließende Häkchen entfernt, ditto werden escapete Trenner in *nicht* gequoteten Feldern unescaped. Enthält ein gequotetes Feld escapete Häkchen, wie sie zum Quoten verwendet wurden, werden diese unescaped. Setzt man Bit 0 von Parameter #4 (Parm #4 & 1 == 1), werden Häkchen nicht entfernt, und es wird nichts unescapet. - Wird Parameter 3 auf einen Wert <> 0 gesetzt, enthält das letzte (bzw. erste) Feld des Ergebnisarrays den *unbehandelten* Rest-String. Dies gilt auch dann, wenn der Quellstring zufällig genau so viele Elemente enthielt, wie angefordert wurden! Ist Bit 1 von Parameter #4 gesetzt (Parm #4 & 2 == 2), wird vor der Extraktion ein study() über den Quellstring ausgeführt. Escapen: Trenner oder führende/folgende Häkchen können \-escaped werden, um sie außer Funktion zu setzen. Sollen Escapezeichen vor Trennern oder f/f-Häkchen nicht auf diese wirken, sollten sie ihrerseits \-escaped werden. Trennverhalten mit Häkchen: Als umschließend werden nur gleichartige (" oder ') Häkchen akzeptiert. (Mischformen sind für parse_line übrigens tödlich. Wamm.) Gequotete Felder erkennt e_split an der Folge (^|trenner)"'...."'(trenner|$). D.h., ein öffnendes Häkchen wird *nicht* als Feldumschließer behandelt, wenn zwischen dem 'schließenden' Häkchen und dem folgenden Trenner noch etwas steht. Die Sequenz ...TRENNER"Feld"datenTRENNER... wird als "Feld"daten geliefert. (anders als bei parse_line wird das mittige Häkchen nicht als Trennersurrogat bzw. beginnendes Quoting *innerhalb* des Tokens akzeptiert.) Seltsame Feldbildungen können resultieren, wenn nicht gequotete Quelldaten in der Folge ...TRENNER"Daten von Feld1TRENNERDaten von Feld2"TRENNER... vorliegen. Das führende Häkchen von Feld1 wird identifiziert, e_split sucht den String auf die schließende Sequenz ("TRENNER) ab - und wird am Ende von Feld2 fündig. Hmmm. Abhilfe # muß bei der Datenerzeugung stattfinden. Man escape alle führenden oder folgenden # Häkchen, oder man quote alle (verdächtigen?) Felder. Schwierig wird's, wenn die Felddaten selber die öffnende/schließende Sequenz enthalten können. Während das Quoten normalerweise die Funktion des Trenner-Escapens übernimmt (was man natürlich alternativ auch machen kann), kann man hier sich behelfen, indem man in den Felddaten enthaltene Trenner \-escaped. Diskussion: e_split vs. Text::quote_words Text::quote_words() bedient sich der Routine parse_line() zum Stringzerlegen. Die folgenden Anmerkungen beziehen sich auf parse_line als Kernfunktion. 1. e_split ist zwischen 2,5 (kurze Strings) und fünf mal (lange Strings) schneller als parse_line 2. e_split verhält sich hinsichtlich der Behandlung von Quotingzeichen plausibler # als parse_line (siehe "Trennverhalten mit Häkchen" weiter oben) 3. e_split verträgt Mischformen (bspw. doppelte Häkchen vorne, einfaches hinten). parse_line liefert beim Auftreten solcher Kombis einen leeren Array TODO:
Hinweis: In den Anwendungsbeispielen heben wir ESplit.pm-spezifisches fett hervor. [Anwendungsbeispiel 1][Anwendungsbeispiel 2] [$ex_1]
[$ex_2]
|
zum Seitenanfang |
Letzte Änderung am: 07.06.2000 © 1999 by H. Camphausen <h.camp@creagen.de> |