Reguläre Ausdrücke (RA) sind vergleichsweise sehr mächtig und ein elegantes Mittel, um beispielsweise komplexe und genaue Prüfungen vorzunehmen, sofern die RA in ein geeignet konzipiertes Kommando eingebaut sind. Es liegt nahe, RA in Shell-Skripten vielfältig einzusetzen, wie nachfolgend gezeigt, mit dem Kommando expr.
RA sind Zeichenketten folgender Art:
Es wurde ein Cache-System für RA und kompilierte RA implementiert, damit das
aufwendige Kompilieren bei mehrfach verwendeten RA nach dem ersten Vorkommnis
entfallen kann. Das ist besonders wirksam innerhalb von Schleifenkonstruktionen, die
tausende Male einen gleichen RA heranziehen.
Nach der Implementierung zeigten sich jedoch immer mal wieder diffuse
Fehlererscheinugen, deren Ursache brutto über ein Jahr lang nicht gefunden
und daher auch nicht beseitigt werden konnte!
Fehlererscheinungen zeigten sich oft gar nicht, dann unvermutet subtil, bis
hin zu krachender und unübersehbarer Auswirkung.
Obwohl die verwendeten RA überall sich sehr ähnlich oder gar gleich waren.
Dennoch war immer wieder keine klare Ursache greifbar!
Das Verwenden des oben gezeigten Skriptes hat nun endlich zur Lösung geführt!
Warum das so schwierig war, wird nachfolgend erzählt.
RA und zu untersuchender Text spielen zusammen. In Abhängigkeit davon können Fehler eine Auswirkung haben oder auch nicht. Details sind manchmal redundant, aber eben nicht immer. Bei Redundanz wirkt ein Fehler nicht, da das dadurch gestörte Merkmal - redundant ist.
Zu Fehlererscheinungen kam es erst, nachdem ein RA im Cache war und darin gefunden wurde, wodurch die Kompilier-Funktion nicht ausgeführt wurde. Beim jeweils ersten Anlaufen hatten die selben RA keine Fehler gezeigt!
Zu einem zweiten Antreffen kann es durch zwei oder mehr gleiche RA-Exemplare kommen oder durch mehrfaches zeitliches Aufsuchen ein und desselben Exemplars.
Ob ein vorhandenes Kommando expr überhaupt ausgeführt wird, ist nicht offensichtlich. Eine Ausführung ist oft bedingt.
Der Cache hat relativ wenige Speicherplätze. Es ist ein Ringspeicher, der alte Positionen überschreibt. Wenn ein alter gespeicherter RA überschrieben wird, kann er nicht mehr im Cache gefunden werden, und es kann daher nicht zu einem zugehörigen Nichtausführen der Kompilier-Funktion kommen! Andere RA, die (stattdessen) im Cache gefunden werden, können fehlerunempfindlich oder mit unterschiedlichem Grad fehlerunwahrscheinlich sein.
Die Ursache der Fehlererscheinungen ist das Nichtausführen der Kompilier-Funktion.
Diese Funktion füllt nicht sämtliche Informationen in den kompilierten RA, sondern
legt wenige Informationen auch in globalen Variablen ab.
Außerdem initialisiert sie einige Variablen, die in ihr nicht benutzt werden.
Es wurden bei der Entwicklung des RA-Cache neben dem Kompilat sogar betreffende
globale Informations-Variablen berücksichtigt.
Allerdings wurde eine davon und Initialisierungen nicht beachtet.
Deshalb konnte ein sehr komplexes Fehlerbild entstehen, da alle Funktionen
nach der Kompilier-Funktion ganz verschieden von der (ehemaligen) Hinterlassenschaft
der Kompilier-Funktion betroffen sind, die ja bei Cache-Fund nicht aufgerufen wird.
Diese BRE wurden 1997 entwickelt, die XRE 2015, stärker modularisiert
und strukturiert (struct).
Der alte BRE-Code ist konzeptionell gewiß nicht optimal.
Der neue Code, das Cache-System an sich, war und ist nicht fehlerhaft, was jedoch
logischerweise immer wieder vermutet wurde, womit immer wieder
der Holzweg beschritten wurde.
Sehr geringfügige aber folgenschwere Übersehungen wurden beim Verweben
des neuen Code mit dem alten BRE-System begangen.