Hartmut Camphausen Kirchstr. 8 35043 Marburg Fon: 06424/923826 Fax: 06424/923827 Emil: h.camp@creagen.de

 

 

ESplit.pm -
Perl-Modul zum Auftrennen von Strings an frei wählbaren Zeichen(-ketten)

[Beschreibung] [Verwendung] [Installation] [Feinheiten] [Version] [Copyright] [Autor]

Beschreibung

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]
- Ausgabe:

Array mit gefundenen Tokens (Arraykontext)

Referenz auf Array mit gefundenen Tokens (Skalarkontext)

Hier in eckigen Klammern notierte Parameter sind optional.

  • Wird e_split() ohne Parameter aufgerufen, zerlegt es $_ an beliebigen Leerzeichen (\s+).
  • Wird $separator als undef gegeben, wird ditto an Whitespaces (\s+) zerlegt.
  • Als $quellstring akzeptiert e_split auch eine Referenz auf einen Skalar.
  • $num_of_elements_to_return gibt an, wieviele Elemente (falls in $quellstring vorhanden) zurückgeliefert werden sollen. $tokens[-1] enthält gegebenenfalls den nichtzerlegten Reststring.
  • Ist $num_of_elements_to_return kleiner 0, wird $quellstring von hinten her durchsucht (naja, jedenfalls sieht es für den User so aus :-). Ein unzerlegter Reststring findet sich dann in $tokens[0].

 


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:
  • eine effizientere Methode (RE), um n Elemente vom Ende des Strings zu liefern
  • single/double quotes der Trenner (-RE) unterscheiden?
  • usf.?

 


Verwendung

[zurück
[weiter

Hinweis: In den Anwendungsbeispielen heben wir ESplit.pm-spezifisches fett hervor.

[Anwendungsbeispiel 1]
[Anwendungsbeispiel 2]
		[$ex_1]
    
  [zurück

Anwendungsbeispiel 2:
[zurück
[weiter
		[$ex_2]
    
  [zurück

 


Installation

[zurück
[weiter
  1. Variante: ESplit.pm ins ../Perl5/lib oder ../perl5/lib/site-Verzeichnis kopieren.
  2. Variante: ESplitc.pm in ein beliebiges Verzeichnis kopieren; dann sollte man im aufrufenden Skript die Zeile:
    BEGIN {push (@INC, 'Verzeichnis_wo_ESplit.pm_liegt');}
    notieren.

 


Feinheiten

[zurück
[weiter
 [$item] [zurück
[weiter

[$item_description]

 

 


Version

[zurück]
1.00 vom 07.06.2000

 


Copyright

[zurück]
Copyright © 2000 by Hartmut Camphausen. Alle Rechte vorbehalten. Dies ist freie Software. Sie kann unter denselben Bedingungen wie Perl selbst verändert und/oder weitergegeben werden.

 


Autor

[zurück]
Hartmut Camphausen <h.camp@creagen.de>

 

 

 

 
zum Seitenanfang Letzte Änderung am: 07.06.2000
© 1999 by H. Camphausen <h.camp@creagen.de>