Verlautbarung 256 der Entw.Abt. 2013-12-02 ------------------------------- Der $ in lokalen Ersetzungen der Exportparameter ================================================ In der Vb255 wurde, wegen Termindrucks ohne vorherige Diskussion und Ankndigung, eine u.U. wichtige Žnderung beschrieben. Auf Grnde und m”gliche Auswirkungen wurde noch nicht eingegangen. Das wird hiermit nachgeholt, mit der notwendigen ersch”pfenden Grndlichkeit. (Es mochte wie eine klammheimliche Nachbesserung aussehen, was natrlich grober Unfug w„re.) Der Kern ist: Auch das $-Zeichen ist nun ersetzbar, aber existierende Parameter arbeiten ohne Žnderung, auáer in unlogischen F„llen. Dies erzwingt leider eine eigenwillige Syntax, sollen bestehende Parameter nicht entwertet werden. Abhilfe k”nnte evtl. ein neuer Befehl bringen. ACHTUNG: Standard-Anwender, die nicht selber parametrieren, brauchen nicht weiterzulesen, sie sind nicht betroffen. ********************************************************************** Vor allem ist wichtig: Die ge„nderte Wirkung ist vorerst nur in a99/alcarta und acon eingebaut, noch nicht in srch, import und index. Letzteres soll noch kommen. Sollte sich aber massiver und begrndeter Widerstand regen, dann nicht. Eigentlich h„tte man dies vor der Fest- schreibung der V33.5 tun sollen, nur war dafr keine Zeit. Hinzuweisen ist ferner auf die M”glichkeiten der FLEX-Sprache, die im "Trick 74" ausfhrlich behandelt sind: http://www.allegro-c.de/tricks.htm#74 Auáerdem gibt es schon beim Import eine eigene M”glichkeit, mit dem $ umzugehen, siehe dazu den Fall 3. unten und in a99: h ac11-3 NUN ZUR SACHE SELBST, und zwar in zwei Fassungen: (Vorausgesetzt werden Kenntnisse der Exportparametrierung. Alle Beispiele wurden mit V33.4 und V33.5 verifiziert.) *********************************************************************** A. Kurzfassung der neuen M”glichkeiten -------------------------------------- Regel: Der $ am Anfang, also ,"_$..._..._" hatte bisher gar keine Wirkung, jetzt schaltet er die bekannte Wirkung ab. I. Ersetzung des $ durch X: ,"_$$_X_" (X = beliebige Zeichenfolge) Sonderfall X =  Unterfeld-Dreieck (DOS-Code 31 / Win 178): ,"_$$__" Einzelfall: $x durch x: ,"_$$x_x_" II. Ersetzung von $x durch $y: ,"_$$x_$y_" III. Ersetzung von A$B durch AXB: ,"_$A$B_AXB_" mit beliebigen Zeichenfolgen A, X und B Hinweis: Was im Export, anders als mit FLEX, (noch) nicht geht, ist die Schreibweise ^031 statt des Dreiecks. *********************************************************************** B. Langfassung, falls jemand *alles ganz genau* wissen will ----------------------------------------------------------- (incl. wom”glich nie aufgetretener F„lle) Vorrede ------- In einem Manipulationsbefehl ,"_abc_XYZ_" war und bleibt das $-Zeichen in XYZ ohne Sonderwirkung, in abc dagegegen hatte es eine Funktion, aber NUR an der Position c, also z.B. ,"_ab$_XYZ_" Dann wurde "ab" und alles, was noch folgte, durch XYZ ersetzt, d.h. der Rest des Feldes wurde abgezwackt, im Beispiel also incl. "ab". Ein $ an anderer Stelle innerhalb abc war schlicht nicht vorgesehen, die Wirkung war zwar nicht undefiniert, aber unlogisch. Zur der Zeit, als das Unterprogramm entstand, kam der $ innerhalb von Datens„tzen wohl kaum vor, wie auch immer. Daraus ergab sich: Stand hinter dem $ noch etwas, also ,"_abc$d_XYZ_", dann hatte der $ keine funktionale Wirkung, sondern der Befehl „nderte am Text nichts. Insbes. konnte man leider mit der lokalen Ersetzung den $ als solchen nicht ersetzen (s. dazu unten Fall 3. und oben Fall I.). Desiderat war deshalb, das Zeichen $ auch als solches mittels lokaler Ersetzung wie jedes andere Zeichen ersetzen zu k”nnen. Jedoch sollte sich das Verhalten „lterer Parameter nicht „ndern. Viel besser als das hier beschriebene Verfahren w„re es natrlich, das ist zuzugeben, man h„tte z.B. ein exakt dem Vorbild der regul„ren Ausdrcke entsprechendes Paradigma. Dies k”nnte in die Exportparameter leider kaum eingebaut werden, sondern allenfalls in FLEX. Vorerst wird man mit dem nicht fr jeden befriedigenden status quo noch eine unbestimmte Weile leben mssen. SOLLTE sich eine Žnderung realisieren lassen, dann sicher nicht so, daá die bisherigen Befehle ge„ndert wrden, denn dadurch w„ren dann bestehende Parameter entwertet, die Kontinuit„t also gebrochen. Nur ein *neuer* Befehl k”nnte hier *theoretisch* Abilfe schaffen. Und warum wurde nicht von vornherein mit regul„ren Ausdrcken gearbeitet? Nun, wir kannten das damals nur unter UNIX existierende Konzept gar nicht, als der Export 1986 in der ersten und noch heute kompatiblen Fassung unter MS-DOS programmiert wurde. Ein vollkalibriges grep ist u.U. gar nicht notwendig. Es gibt eine sehr knappe, „uáerst gute Implementierung der fr uns wichtigen Teilfunktionen [1], die als Neuerung begráenswert w„re. Darber kann man noch diskutieren, und eigentlich k”nnte das auch mal, die Quellen sind ja offen, jemand anders machen. Wie sieht es nun also aus ab V33.5? ----------------------------------- Als Beispiel nehmen wir dieses Datenfeld: #81 Text$Hinweis$ENDE und wollen das $-Zeichen „ndern und evtl. auch noch, was davor und dahinter steht. Was ist dabei zu beachten? Wir schauen uns 7 verschiedene F„lle an, die alles umfassen, was in den Parametern erwnscht sein k”nnte. In einigen F„llen war bisher das Ergebnis unerwartet oder so gut wie sinnlos, und die Žnderung des $ selbst war, wie gesagt, nicht m”glich. Das sollte sich „ndern. In den Beispielen ist /// statt XYZ gesetzt, denn es spielt ja keine Rolle, was da steht, und so wird die Wirkung besser sichtbar. Parameter bis V33.4 V33.5 ----------------------------------------------------------------------- 1. #81 ,"_t$_///_" Tex/// Tex/// Ersetzt t und den ganzen Rest des Feldinhalts durch /// Diese Hauptfunktion des $ am Ende von abc „ndert sich nicht. 2. #81 ,"_$_///_" Text///E Text$Hinweis$ENDE Bis V33.4 unlogische Wirkung / Ab V33.5 Keine Aktion Hier k”nnte man erwarten, daá der Feldinhalt insgesamt nicht ausgegeben wird, sondern ///. Das jedoch erreicht man leichter mit #81 p"///" y0 e3 Bis V33.4 wurde nach dem $ gesucht und dieser mitsamt dem Rest des Feldes beseitigt, nur das letzte Zeichen nicht. Das war unlogisch und nicht sinnvoll. Wenn diese spezielle Variante bisher vorkam, hatte sie also eine unerwnschte Wirkung. Das *einzige* Beispiel fand sich in pica3a.ppt, eingebunden nur in d-1.ppr, die Anzeigeparameter fr Pica-Daten in PRESTO. Und in diesem Fall ist es nun wohl besser als vorher, wenngleich ebenfalls unrichtig. Tip fr Parametrierer: Wenn Sie das Hilfsprogramm grep haben, k”nnen Sie mit grep _\$ *.?p? Ihre Parameter nach solchen Fehlern absuchen. Siehe auch 7a. 3. #81 ,"_$$_///_" Text/// Text///Hinweis///ENDE Unlogische Wirkung / Ersetzt jedes $ durch /// Hier passiert also ab V33.5, was man im Fall 2. eigentlich wollte: Die Wirkung bis V33.4 war wohl kaum sinnvoll. Dies ist ein Spezialfall des neuen Falles 7., s.u., insbes. 7b. Aus bisheriger Sicht ist dies der interessanteste Fall, weil man mit lokaler Ersetzung den $ als solchen nicht ersetzen konnte, z.B. durch das Unterfeld-Dreieck. Nun kann man das leicht machen, indem man nur _$$_^031_ setzt statt _$_?_ (Mit p- oder q-Befehl konnte man das hilfsweise meistens l”sen: p $ "///" bzw. q $ "///") Oder auch, wenn es sich um Import handelte, mit y $ 31, um schon beim Einlesen den $ durch Code 31 zu ersetzen. Die lokale Ersetzung in den *Importparametern* klappte dagegen schon immer, der $ hatte dabei keine Sonder- funktion. (Fr Programmierer: Funktion cfind() in import.c) 4. #81 ,"_t$$_///_" Text$Hinweis$ENDE Text$Hinweis$ENDE Nach wie vor ohne Wirkung, aber auch entbehrlich! Die Erwartung, die Zeichenfolge t$ samt Rest wrde ersetzt durch ///, erfllte und erfllt sich nicht! Nur mit exakt *einem* $ am Ende klappt das. Es gibt andere M”glichkeiten: Um die Zeichenfolge t$$ samt Rest zu ersetzen durch /// : z.B. ,"_$t$$_///%%%_" e"%%%" aber NUR ab V33.5, siehe 7. Oder aber: e"t$$" P"///" was auch bis V33.4 schon ging. 5. #81 ,"_t$$H_///_" Text$Hinweis$ENDE Text$Hinweis$ENDE Nach wie vor ohne wirkung, aber ebenfalls entbehrlich! Eine Ersetzung der Zeichenfolge t$$H war vorher unm”glich, jetzt aber geht es mit ,"_$t$$H_///_" (Spezialfall von 7.) 6. #81 ,"_t$H_///_" Text$Hinweis$ENDE Text$Hinweis$ENDE Nach wie vor ohne wirkung. Aber ab V33.5 s. 7.! Bis V33.4 h„tte man denken k”nnen, daá nach t gesucht wird, wie ersten Fall, und dieses samt Rest verschw„nde, ohne Wirkung des H. So war's aber nicht, und das hat sich nicht ge„ndert. Diesen Fall k”nnte man immer noch etwas unglcklich finden, er wird aber entsch„rft durch 7, mit dem man eine definierte und bisher nicht vorgesehene Wirkung erreicht: 7. #81 ,"_$t$H_///_" Text$Hinweis$ENDE Tex///inweis$ENDE Wirkungslos / ersetzt t$H durch /// Bis V33.4 hatte ein $ am Anfang von "abc" keine Wirkung, d.h. der Ersetzungsbefehl tat einfach nichts. Das sollte nicht so bleiben. Nun hat der $ an der ersten Position die Bedeutung: Suche nach der Zeichenfolge t$H und ersetze diese durch ///. Soll der Rest hinter t$H verschwinden, muá man erg„nzen: ,"_$t$H_///_" e"///" Bisher hatte dies gar keine Wirkung, es sei denn, im Text des Feldes kam schon /// vor. 7a. #81 ,"_$t_///_" Text$Hinweis$ENDE Tex///$Hinweis$ENDE Bis V33.4 keine Wirkung, weil $ am Anfang nicht vorgesehen. Ab V33.5 wird jedes t durch /// ersetzt; der $ am Anfang ist wirkungslos! Falls in alten Parametern so eine Kombination auftritt, ergibt sich jetzt eine Wirkung, wo vorher keine war. Solche F„lle sind aber gerade deswegen „uáerst unwahrscheinlich und h„tten von der Sache her erst gar nicht vorkommen drfen, d.h. sie waren l„ngst und sind jetzt definitiv korrekturbedrftig. 7b. #81 ,"_$$H_$x_" Text$Hinweis$ENDE Text$xinweis$ENDE Unterfeldcode $H wird durch $x ersetzt Neben 3. ist dies die zweith„ufigst erwnschte Wirkung, die bisher nicht m”glich war. ----------------------------------------------------------------------- [1] Brian Kernighan: A regular expression matcher. In: Beautiful Code / Ed. by Andy Oram and Greg Wilson. - O'Reilly, 2007, S. 1-9. Online: http://www.cs.princeton.edu/courses/archive/spr09/cos333/beautiful.html