Engine Room - V1N3 (German): Difference between revisions

From OS2World.Com Wiki
Jump to navigation Jump to search
No edit summary
Ak120 (talk | contribs)
mNo edit summary
Line 1: Line 1:
[[Image:engine.gif|Engage]] <br> [[Image:weenie.gif|left|Major Weenie's Machinenraum]]<br>
[[Image:engine.gif|Engage]] [[Image:weenie.gif|left|Major Weenie's Machinenraum]]<br>


Major Weenie tendiert dazu, ein wenig m&uuml;rbe zu werden, nachdem er die halbe
Major Weenie tendiert dazu, ein wenig mürbe zu werden, nachdem er die halbe
Nacht auf war, um mit Mr. Worf die verschiedensten klingonischen Delikatessen,
Nacht auf war, um mit Mr. Worf die verschiedensten klingonischen Delikatessen,
wie gakh zu probieren. Es ist dabei nicht einmal die Tatsache, da&szlig; das Essen
wie gakh zu probieren. Es ist dabei nicht einmal die Tatsache, daß das Essen
versucht vom Teller zu kriechen, w&auml;hrend man versucht, es zu essen - es ist der
versucht vom Teller zu kriechen, während man versucht, es zu essen - es ist der
Pflaumensaft, mit dem man es runtersp&uuml;lt, der mich fertigmacht.
Pflaumensaft, mit dem man es runterspült, der mich fertigmacht.
<br>
 
<br>
Im Hinblick auf den heutigen geschwächten Zustand des Majors werden wir uns
Im Hinblick auf den heutigen geschw&auml;chten Zustand des Majors werden wir uns
daher auf eine kurze, einfache Lektion beschränken.
daher auf eine kurze, einfache Lektion beschr&auml;nken.
<br>
<br>


Ich glaube, das letzte mal verlie&szlig;en wir unsere Diskussion &uuml;ber REXX mit ein
Ich glaube, das letzte mal verließen wir unsere Diskussion über REXX mit ein
paar sehr einfachen Beispielen.  Nun la&szlig;t uns mal die Empf&auml;nger etwas
paar sehr einfachen Beispielen.  Nun laßt uns mal die Empfänger etwas
empfindlicher einstellen und das Dateihandling untersuchen.
empfindlicher einstellen und das Dateihandling untersuchen.
<br>
<br>


Nun, die meisten Dateien, die sie mit REXX ver&auml;ndern werden, werden keine
Nun, die meisten Dateien, die sie mit REXX verändern werden, werden keine
Bin&auml;rdateien sein - sie k&ouml;nnten zwar eine Datenbank Applikation in REXX
Binärdateien sein - sie könnten zwar eine Datenbank Applikation in REXX
schreiben, aber sie sollten es nicht. Sie erinnern sich, soweit es den Major
schreiben, aber sie sollten es nicht. Sie erinnern sich, soweit es den Major
betrifft, ist REXX am besten geeignet f&uuml;r relativ einfache Aufgaben, wie
betrifft, ist REXX am besten geeignet für relativ einfache Aufgaben, wie
Systemverwaltung.  Wenn sie eine Datenbank m&ouml;chten, empfiehlt der Major DB2/2
Systemverwaltung.  Wenn sie eine Datenbank möchten, empfiehlt der Major DB2/2
von IBM, Approach von Lotus Development oder nehmen sie sich einen Indelible
von IBM, Approach von Lotus Development oder nehmen sie sich einen Indelible
Blue Katalog und schauen sie sich andere M&ouml;glichkeiten an.
Blue Katalog und schauen sie sich andere Möglichkeiten an.
<br>
<br>


Also, welche Dateitypen werden sie h&ouml;chstwahrscheinlich mit REXX bearbeiten?
Also, welche Dateitypen werden sie höchstwahrscheinlich mit REXX bearbeiten?
Kommen sie, h&ouml;ren sie auf, mit dem Replikator zu spielen und denken sie mal
Kommen sie, hören sie auf, mit dem Replikator zu spielen und denken sie mal
nach. Richtig, Textdateien. Was ist die eine Textdatei, die man auf jedem Warp
nach. Richtig, Textdateien. Was ist die eine Textdatei, die man auf jedem Warp
System findet, selbst, wenn es der Major installiert hat ? Richtig, README.
System findet, selbst, wenn es der Major installiert hat ? Richtig, README.
<br>
<br>
    
    
Nun, eine Eigenschaft die README mit fast jeder anderen einfachen Textdatei
Nun, eine Eigenschaft die README mit fast jeder anderen einfachen Textdatei
gemeinsam hat, die aus einer beliebigen Ecke des Quadranten eingeflogen
gemeinsam hat, die aus einer beliebigen Ecke des Quadranten eingeflogen
kommt, ist die, da&szlig; sie nicht in einzelne Seiten unterteilt ist. Und wenn wir
kommt, ist die, daß sie nicht in einzelne Seiten unterteilt ist. Und wenn wir
von einer Seitenunterteilung reden, dann reden wir &uuml;blicherweise &uuml;ber das
von einer Seitenunterteilung reden, dann reden wir üblicherweise über das
Vorhandensein des ASCII Zeichens mit der Nummer 12, das nichts anderes als ein
Vorhandensein des ASCII Zeichens mit der Nummer 12, das nichts anderes als ein
Seitenvorschub ist. W&auml;re es nicht sch&ouml;n, wenn man vorher w&uuml;&szlig;te, wieviele
Seitenvorschub ist. Wäre es nicht schön, wenn man vorher wüßte, wieviele
Seiten ein Ausdruck von README oder einer anderen einfachen Textdatei
Seiten ein Ausdruck von README oder einer anderen einfachen Textdatei
ben&ouml;tigen wird ? B&auml;ume wachsen nunmal nicht auf B&auml;umen, wie sie wissen.
benötigen wird ? Bäume wachsen nunmal nicht auf Bäumen, wie sie wissen.
<br>
<br>


Hier ist eine M&ouml;glichkeit, das mit einer einfachen REXX Datei herauszufinden.
Hier ist eine Möglichkeit, das mit einer einfachen REXX Datei herauszufinden.
Vergessen sie nicht, da&szlig; jede REXX Datei mit einem Kommentar beginnen mu&szlig; (und
Vergessen sie nicht, daß jede REXX Datei mit einem Kommentar beginnen muß (und
der Kommentar ist alles, was zwischen den Zeichen /* und */ zu finden ist).
der Kommentar ist alles, was zwischen den Zeichen /* und */ zu finden ist).
<br>
<br>


Nachdem wir nun den Kommentar aus dem Weg ger&auml;umt haben, wie bekommen wir
Nachdem wir nun den Kommentar aus dem Weg geräumt haben, wie bekommen wir
unser Programm dazu, tats&auml;chlich README oder eine andere Datei zu &ouml;ffnen und
unser Programm dazu, tatsächlich README oder eine andere Datei zu öffnen und
zu manipulieren. Ein einfacher Weg ist, den Dateinamen sofort beim Aufruf des
zu manipulieren. Ein einfacher Weg ist, den Dateinamen sofort beim Aufruf des
Programms zu erfassen. Das passiert mit dem ARG Befehl.
Programms zu erfassen. Das passiert mit dem ARG Befehl.
<br>
<br>


Leute, so f&uuml;hlt sich mein Magen an nach all dem gakh...
Leute, so fühlt sich mein Magen an nach all dem gakh...
<br>
<br>
 
Tats&auml;chlich ist ARG der Befehl, mit dem sie in ihrem Programm all das erfassen
k&ouml;nnen, was der Anwender in der Kommadozeile eingetippt hat. Wenn ihr Programm
"countwords.cmd" hei&szlig;t dann sieht die Zeile, mit der sie in countwords die
Datei erhalten k&ouml;nnen, mit der gearbeitet werden soll, so aus:
<br>
<br> '''ARG filename'''<br>
<br>


Tatsächlich ist ARG der Befehl, mit dem sie in ihrem Programm all das erfassen
können, was der Anwender in der Kommadozeile eingetippt hat. Wenn ihr Programm
"countwords.cmd" heißt dann sieht die Zeile, mit der sie in countwords die
Datei erhalten können, mit der gearbeitet werden soll, so aus:
ARG filename
"filename" wird, im Rahmen des Programms, die Datei, mit der sie arbeiten,
"filename" wird, im Rahmen des Programms, die Datei, mit der sie arbeiten,
sprich, ARG erfasst, was sie auf der Kommandozeile eingegeben haben und
sprich, ARG erfasst, was sie auf der Kommandozeile eingegeben haben und
Line 77: Line 57:
sie in diesem Beispiel "countwords readme" auf der Kommandozeile eingeben,
sie in diesem Beispiel "countwords readme" auf der Kommandozeile eingeben,
wird "readme" der variable "filename" zugewiesen.
wird "readme" der variable "filename" zugewiesen.
<br>
<br>


So, jetzt haben sie den Dateinamen, und was jetzt ? OK, zuerst lege ich mal
So, jetzt haben sie den Dateinamen, und was jetzt ? OK, zuerst lege ich mal
diesen Disruptor weg oder lasse ihn sicher nicht so auf meinen Kopf zeigen...
diesen Disruptor weg oder lasse ihn sicher nicht so auf meinen Kopf zeigen...
Egal, was ist das Schlaueste, was man zu diesem Zeitpunkt machen kann ?
Egal, was ist das Schlaueste, was man zu diesem Zeitpunkt machen kann ?
<br>
<br>
Richtig, sagen sie dem Anwender, da&szlig; er es verbockt hat, wenn er &uuml;berhaupt
nichts eingegeben hat. Sie k&ouml;nnen das so machen:


<pre>'''
Richtig, sagen sie dem Anwender, daß er es verbockt hat, wenn er überhaupt
nichts eingegeben hat. Sie können das so machen:
<pre>
If filename = "" then Do
If filename = "" then Do
Say 'Sie m&uuml;ssen einen Dateinamen angeben, wenn sie  COUNTWORDS aufrufen.'
Say 'Sie müssen einen Dateinamen angeben, wenn sie  COUNTWORDS aufrufen.'
         Say 'Bitte versuchen sie es nochmal. . .'
         Say 'Bitte versuchen sie es nochmal. . .'
         Exit
         Exit
End /* do */'''
End /* do */
</pre>
</pre>
 
Ok, halten wir mal kurz hier an. Zwei Probleme, die außerhalb Major Weenies Kontrolle liegen: Zum einen das Problem, das hier für das Low-Tech Internet auszulegen. Fragen sie nicht den Major, wenn es darum geht, all die TABs und so weiter richtig zusammenzubasteln. Zum anderen ist REXX nicht C oder C++,
 
Ok, halten wir mal kurz hier an. Zwei Probleme, die au&szlig;erhalb Major Weenies
Kontrolle liegen: Zum einen das Problem, das hier f&uuml;r das Low-Tech Internet
auszulegen. Fragen sie nicht den Major, wenn es darum geht, all die TABs und
so weiter richtig zusammenzubasteln. Zum anderen ist REXX nicht C oder C++,
also kommen sie mir nicht mit klassischem Zeug, wie "Nur ein Exit Punkt im einem
also kommen sie mir nicht mit klassischem Zeug, wie "Nur ein Exit Punkt im einem
Programm".
Programm".
    
    
So, das mu&szlig;te gesagt werden - was nun ? Jetzt m&uuml;ssen sie die Datei &ouml;ffnen.
So, das mußte gesagt werden - was nun ? Jetzt müssen sie die Datei öffnen.
    
    
Die einfachste M&ouml;glichkeit, eine Datei in REXX zu ver&auml;ndern, ist nach Meinung
Die einfachste Möglichkeit, eine Datei in REXX zu verändern, ist nach Meinung
des Majors ein einfaches LINEIN Kommando zu verwenden. Das sieht dann so aus:
des Majors ein einfaches LINEIN Kommando zu verwenden. Das sieht dann so aus:
rc = LineIn(Filename,,0)


<pre>'''rc = LineIn(Filename,,0)'''
In diesem Fall speichert REXX den Rückgabewert in "rc". In diesem Beispiel
</pre>
sollte rc Null enthalten, wenn die Datei erfolgreich geöffnet werden konnte.
 
Wenn sie in der REXX Online Hilfe nachschlagen, werden sie sehen, daß LINEIN
 
In diesem Fall speichert REXX den R&uuml;ckgabewert in "rc". In diesem Beispiel
sollte rc Null enthalten, wenn die Datei erfolgreich ge&ouml;ffnet werden konnte.
Wenn sie in der REXX Online Hilfe nachschlagen, werden sie sehen, da&szlig; LINEIN
das Format LineIn(name, line, count) hat.
das Format LineIn(name, line, count) hat.
Beachten sie, da&szlig; ich "line" nicht verwendet habe. Da die Datei nicht ge&ouml;ffnet
Beachten sie, daß ich "line" nicht verwendet habe. Da die Datei nicht geöffnet
war, fing LineIn am Dateianfang an zu lesen und "count" bezeichnet die Anzahl
war, fing LineIn am Dateianfang an zu lesen und "count" bezeichnet die Anzahl
der Zeilen, die ich einlesen wollte. Hier habe ich keine Zeilen gelesen,
der Zeilen, die ich einlesen wollte. Hier habe ich keine Zeilen gelesen,
sondern nur die Datei ge&ouml;ffnet. Aye Bursche, schau in das Handbuch.
sondern nur die Datei geöffnet. Aye Bursche, schau in das Handbuch.


Was brauche ich noch ? Richtig! Irgendwo mu&szlig; ich mir merken, wie viele Worte
Was brauche ich noch ? Richtig! Irgendwo muß ich mir merken, wie viele Worte
und Zeilen ich eingelesen habe. Und wenn wir gerade dabei sind, k&ouml;nnten wir
und Zeilen ich eingelesen habe. Und wenn wir gerade dabei sind, könnten wir
auch gleich feststellen, welches die l&auml;ngste Zeile ist. (Warum ? Weil wir dann
auch gleich feststellen, welches die längste Zeile ist. (Warum ? Weil wir dann
wissen, wie wir den Zeilenumbruch am besten bewerkstelligen). Wir werden mit
wissen, wie wir den Zeilenumbruch am besten bewerkstelligen). Wir werden mit
den drei Z&auml;hlern Counter, Allwords und Longline arbeiten und sie gleich mal
den drei Zählern Counter, Allwords und Longline arbeiten und sie gleich mal
auf Null setzen. Sie k&ouml;nnen das folgenderma&szlig;en machen:
auf Null setzen. Sie können das folgendermaßen machen:


<pre>'''Counter = 0; Allwords = 0; Longline = 0'''
<pre>'''Counter = 0; Allwords = 0; Longline = 0'''
Line 137: Line 104:
Fassen wir also zusammen, was wir machen werden:
Fassen wir also zusammen, was wir machen werden:
* Eine Zeile einlesen
* Eine Zeile einlesen
* Die Worte in der Zeile z&auml;hlen
* Die Worte in der Zeile zählen
* Die Zeilenl&auml;nge feststellen und merken, wenn es die l&auml;ngste bisher gefundene Zeile ist.
* Die Zeilenlänge feststellen und merken, wenn es die längste bisher gefundene Zeile ist.
 
Und so sieht das aus...
Und so sieht das aus...
<pre>'''
<pre>'''
Do While Lines(Filename) &lt &gt 0          /* 'Lines' arbeitet bis keine Zeilen mehr da sind. */
Do While Lines(Filename) &lt &gt 0          /* 'Lines' arbeitet bis keine Zeilen mehr da sind. */
   Inp = Linein(Filename)              /* Inp enth&auml;lt den Inhalt der Zeile */
   Inp = Linein(Filename)              /* Inp enthält den Inhalt der Zeile */
   Y = Words(Inp)              /* 'Words' liefert die Anzahl der Worte in der Zeile */
   Y = Words(Inp)              /* 'Words' liefert die Anzahl der Worte in der Zeile */
   Z = Length(Inp)              /* 'Length' stellt fest, wie lang die Zeile ist */
   Z = Length(Inp)              /* 'Length' stellt fest, wie lang die Zeile ist */
   if Z > Longline then LongLine = Z    /* sie wissen schon... :-) */
   if Z > Longline then LongLine = Z    /* sie wissen schon... :-) */
   Counter = Counter + 1                /* Z&auml;hler erh&ouml;hen und        */
   Counter = Counter + 1                /* Zähler erhöhen und        */
   Allwords = Allwords + Y      /* die Anzahl der Worte in der Zeile speichern */
   Allwords = Allwords + Y      /* die Anzahl der Worte in der Zeile speichern */
End /* do */
End /* do */
Line 154: Line 119:
'''
'''
</pre>
</pre>
Ok, wir haben alle diese Informationen zusammengesucht, was machen wir jetzt damit?
Ok, wir haben alle diese Informationen zusammengesucht, was machen wir jetzt damit?


Nun, wir zeigen sie mit dem '''SAY''' Befehl an. Richtig, sie lesen
Nun, wir zeigen sie mit dem '''SAY''' Befehl an. Richtig, sie lesen
meine Gedanken: Schlagen sie mal im Handbuch unter dem SAY Befehl nach.
meine Gedanken: Schlagen sie mal im Handbuch unter dem SAY Befehl nach.
Einige Hinweise zum SAY Befehl: Das, was sie auf dem Bildschirm anzeigen
Einige Hinweise zum SAY Befehl: Das, was sie auf dem Bildschirm anzeigen
m&ouml;chten, mu&szlig; in einfache (') oder doppelte (") Anf&uuml;hrungszeichen
möchten, muß in einfache (') oder doppelte (") Anführungszeichen
eingeschlossen werden, mit Ausnahme von definierten Variablen. Wenn sie also
eingeschlossen werden, mit Ausnahme von definierten Variablen. Wenn sie also
diese Befehle in ihr Programm schreiben:
diese Befehle in ihr Programm schreiben:
 
<pre>
<pre>'''
One = "Willkommen zu"
One = "Willkommen zu"
Two = "meinem"
Two = "meinem"
Three = "Alptraum"
Three = "Alptraum"
Say Eins Zwei Drei
Say Eins Zwei Drei
'''
</pre>
Dann erscheint auf dem Bildschirm:
<pre>'''Willkommen zu meinem Alptraum'''
</pre>
</pre>
 
Dann erscheint auf dem Bildschirm:
'''Willkommen zu meinem Alptraum'''
Wenn sie Eins, Zwei oder Drei nicht definiert haben, bekommen sie:
Wenn sie Eins, Zwei oder Drei nicht definiert haben, bekommen sie:
Eins Zwei Drei


<pre>'''Eins Zwei Drei'''
Wenn sie das hier vorher gemacht hätten:
</pre>
<pre>
 
 
Wenn sie das hier vorher gemacht h&auml;tten:
 
<pre>'''
Eins = 1
Eins = 1
Zwei = 2
Zwei = 2
Drei = 3
Drei = 3
Say Eins + Zwei + Drei '''
Say Eins + Zwei + Drei
</pre>
</pre>
 
würde ihr Programm anzeigen... nein, das würde ihnen ja den ganzen Spaß verderben.
w&uuml;rde ihr Programm anzeigen... nein, das w&uuml;rde ihnen ja den ganzen Spa&szlig;
 
verderben.
Und so will ich das ganze verwenden: Zuerst müssen wir herausfinden, wie viele Seiten es gibt, indem wir die Anzahl der Zeilen durch 66 teilen. Sechundsechzig
 
ist absolut willkührlich und ist eine Zahl, die ihren Ursprung weit in der
Und so will ich das ganze verwenden: Zuerst m&uuml;ssen wir herausfinden, wie viele
Steinzeit hat, als Nadeldrucker üblicherweise nur 66 Zeilen auf einer Seite
Seiten es gibt, indem wir die Anzahl der Zeilen durch 66 teilen. Sechundsechzig
ist absolut willk&uuml;hrlich und ist eine Zahl, die ihren Ursprung weit in der
Steinzeit hat, als Nadeldrucker &uuml;blicherweise nur 66 Zeilen auf einer Seite
unterbringen konnten. Also definiere und berechne ich "Seite" so:
unterbringen konnten. Also definiere und berechne ich "Seite" so:
 
<pre>Seites = Trunc((Counter/66),1); If Seites = 0 Then Seites =
<pre>'''Seites = Trunc((Counter/66),1); If Seites = 0 Then Seites =
Trunc((Counter/66),2)
Trunc((Counter/66),2)'''
</pre>
</pre>
 
Das "Trunc" Kommando sorgt für eine handhabbare Anzahl Nachkommastellen. Die Zahl auf zwei Stellen abzuschneiden, wenn weniger als eine Seite Daten vorhanden ist, ist eigentlich Overkill. Andererseits... der Major bevorzugt Feuerkraft...
 
Das "Trunc" Kommando sorgt f&uuml;r eine handhabbare Anzahl Nachkommastellen. Die
Zahl auf zwei Stellen abzuschneiden, wenn weniger als eine Seite Daten
vorhanden ist, ist eigentlich Overkill. Andererseits... der Major bevorzugt
Feuerkraft...
 


Nachdem wir das herausgefunden haben, schreibe ich noch folgendes:
Nachdem wir das herausgefunden haben, schreibe ich noch folgendes:
 
  '''Say Filename 'enthält 'Counter' Zeilen - das entspricht 'Seites' Seiten mit je 66 Zeilen.'
  '''Say Filename 'enth&auml;lt 'Counter' Zeilen - das entspricht 'Seites' Seiten mit je 66 Zeilen.'
  Say 'Die längste Zeile in der Datei ist 'LongLine' Zeichen lang. Es gibt '
  Say 'Die l&auml;ngste Zeile in der Datei ist 'LongLine' Zeichen lang. Es gibt '
  Say AllWords' Worte in der Datei.'
  Say AllWords' Worte in der Datei.'
  '''
  '''
Sicher werden sie die Datei, die sie geöffnet haben, auch wieder schließen wollen, also werde ich ihnen eine kleine Aufgabe geben, mit der sie sich beschäftigen können, anstatt nach Dienst die Schiffsenergie im Holodeck zu verbraten. (Ach, und wir haben dieses gewisse Programm gefunden...) Schauen sie sich mal den '''STREAM''' Befehl an.


Sicher werden sie die Datei, die sie ge&ouml;ffnet haben, auch wieder schlie&szlig;en
Wenn sie mir bis hierhin folgen konnten und CountWords mit der README Datei laufen ließen, sollten sie ein Ergebnis bekommen haben, das etwa so aussieht:
wollen, also werde ich ihnen eine kleine Aufgabe geben, mit der sie sich
besch&auml;ftigen k&ouml;nnen, anstatt nach Dienst die Schiffsenergie im Holodeck zu
verbraten. (Ach, und wir haben dieses gewisse Programm gefunden...) Schauen
sie sich mal den '''STREAM''' Befehl an.


Wenn sie mir bis hierhin folgen konnten und CountWords mit der README Datei
   '''README enthält 851 Zeilen - das entspricht 12.8 Seiten mit je 66 Zeilen.
laufen lie&szlig;en, sollten sie ein Ergebnis bekommen haben, das etwa so aussieht:
   Die längste Zeile in der Datei ist 74 Zeichen lang. Es gibt 3984 Worte in der Datei.'''
 
   '''README enth&auml;lt 851 Zeilen - das entspricht 12.8 Seiten mit je 66 Zeilen.
   Die l&auml;ngste Zeile in der Datei ist 74 Zeichen lang. Es gibt 3984 Worte in der Datei.'''
    
    
Oh, hoppla, das ist der Captain, sie m&uuml;ssen mich entschuldigen. Sie haben es
Oh, hoppla, das ist der Captain, sie müssen mich entschuldigen. Sie haben es vermutlich gehört - dieser Fisch, der aus dem Aquarium sprang und den Replikator kurzgeschlossen hat so daß er jetzt, wenn er nach Earl Grey verlangt, etwas eher in der Art eines Duke of Earl bekommt.
vermutlich geh&ouml;rt - dieser Fisch, der aus dem Aquarium sprang und den
Replikator kurzgeschlossen hat so da&szlig; er jetzt, wenn er nach Earl Grey
verlangt, etwas eher in der Art eines Duke of Earl bekommt.


 
Bis zum nächsten Mal bleibe ich ihr
Bis zum n&auml;chsten Mal bleibe ich ihr


Major Weenie
Major Weenie
Line 244: Line 176:
''Major Weenie ist [[Kent Rebman]], ein Technischer Spezialist bei IBM. -ed''  
''Major Weenie ist [[Kent Rebman]], ein Technischer Spezialist bei IBM. -ed''  
----
----
[[Image:wollogos.gif|right|Warp Online]]
[[Image:wollogos.gif|right]]
 
 
[[Category:WarpOnline]]
[[Category:WarpOnline]]

Revision as of 10:36, 25 January 2018

Engage

Major Weenie's Machinenraum
Major Weenie's Machinenraum


Major Weenie tendiert dazu, ein wenig mürbe zu werden, nachdem er die halbe Nacht auf war, um mit Mr. Worf die verschiedensten klingonischen Delikatessen, wie gakh zu probieren. Es ist dabei nicht einmal die Tatsache, daß das Essen versucht vom Teller zu kriechen, während man versucht, es zu essen - es ist der Pflaumensaft, mit dem man es runterspült, der mich fertigmacht.

Im Hinblick auf den heutigen geschwächten Zustand des Majors werden wir uns daher auf eine kurze, einfache Lektion beschränken.

Ich glaube, das letzte mal verließen wir unsere Diskussion über REXX mit ein paar sehr einfachen Beispielen. Nun laßt uns mal die Empfänger etwas empfindlicher einstellen und das Dateihandling untersuchen.

Nun, die meisten Dateien, die sie mit REXX verändern werden, werden keine Binärdateien sein - sie könnten zwar eine Datenbank Applikation in REXX schreiben, aber sie sollten es nicht. Sie erinnern sich, soweit es den Major betrifft, ist REXX am besten geeignet für relativ einfache Aufgaben, wie Systemverwaltung. Wenn sie eine Datenbank möchten, empfiehlt der Major DB2/2 von IBM, Approach von Lotus Development oder nehmen sie sich einen Indelible Blue Katalog und schauen sie sich andere Möglichkeiten an.

Also, welche Dateitypen werden sie höchstwahrscheinlich mit REXX bearbeiten? Kommen sie, hören sie auf, mit dem Replikator zu spielen und denken sie mal nach. Richtig, Textdateien. Was ist die eine Textdatei, die man auf jedem Warp System findet, selbst, wenn es der Major installiert hat ? Richtig, README.

Nun, eine Eigenschaft die README mit fast jeder anderen einfachen Textdatei gemeinsam hat, die aus einer beliebigen Ecke des Quadranten eingeflogen kommt, ist die, daß sie nicht in einzelne Seiten unterteilt ist. Und wenn wir von einer Seitenunterteilung reden, dann reden wir üblicherweise über das Vorhandensein des ASCII Zeichens mit der Nummer 12, das nichts anderes als ein Seitenvorschub ist. Wäre es nicht schön, wenn man vorher wüßte, wieviele Seiten ein Ausdruck von README oder einer anderen einfachen Textdatei benötigen wird ? Bäume wachsen nunmal nicht auf Bäumen, wie sie wissen.

Hier ist eine Möglichkeit, das mit einer einfachen REXX Datei herauszufinden. Vergessen sie nicht, daß jede REXX Datei mit einem Kommentar beginnen muß (und der Kommentar ist alles, was zwischen den Zeichen /* und */ zu finden ist).

Nachdem wir nun den Kommentar aus dem Weg geräumt haben, wie bekommen wir unser Programm dazu, tatsächlich README oder eine andere Datei zu öffnen und zu manipulieren. Ein einfacher Weg ist, den Dateinamen sofort beim Aufruf des Programms zu erfassen. Das passiert mit dem ARG Befehl.

Leute, so fühlt sich mein Magen an nach all dem gakh...

Tatsächlich ist ARG der Befehl, mit dem sie in ihrem Programm all das erfassen können, was der Anwender in der Kommadozeile eingetippt hat. Wenn ihr Programm "countwords.cmd" heißt dann sieht die Zeile, mit der sie in countwords die Datei erhalten können, mit der gearbeitet werden soll, so aus:

ARG filename

"filename" wird, im Rahmen des Programms, die Datei, mit der sie arbeiten, sprich, ARG erfasst, was sie auf der Kommandozeile eingegeben haben und speichert es in dem Variablennamen, den sie hinter ARG angegeben haben. Wenn sie in diesem Beispiel "countwords readme" auf der Kommandozeile eingeben, wird "readme" der variable "filename" zugewiesen.

So, jetzt haben sie den Dateinamen, und was jetzt ? OK, zuerst lege ich mal diesen Disruptor weg oder lasse ihn sicher nicht so auf meinen Kopf zeigen... Egal, was ist das Schlaueste, was man zu diesem Zeitpunkt machen kann ?

Richtig, sagen sie dem Anwender, daß er es verbockt hat, wenn er überhaupt nichts eingegeben hat. Sie können das so machen:

If filename = "" then Do
	Say 'Sie müssen einen Dateinamen angeben, wenn sie  COUNTWORDS aufrufen.'
        Say 'Bitte versuchen sie es nochmal. . .'
        Exit
End /* do */

Ok, halten wir mal kurz hier an. Zwei Probleme, die außerhalb Major Weenies Kontrolle liegen: Zum einen das Problem, das hier für das Low-Tech Internet auszulegen. Fragen sie nicht den Major, wenn es darum geht, all die TABs und so weiter richtig zusammenzubasteln. Zum anderen ist REXX nicht C oder C++, also kommen sie mir nicht mit klassischem Zeug, wie "Nur ein Exit Punkt im einem Programm".

So, das mußte gesagt werden - was nun ? Jetzt müssen sie die Datei öffnen.

Die einfachste Möglichkeit, eine Datei in REXX zu verändern, ist nach Meinung des Majors ein einfaches LINEIN Kommando zu verwenden. Das sieht dann so aus:

rc = LineIn(Filename,,0)

In diesem Fall speichert REXX den Rückgabewert in "rc". In diesem Beispiel sollte rc Null enthalten, wenn die Datei erfolgreich geöffnet werden konnte. Wenn sie in der REXX Online Hilfe nachschlagen, werden sie sehen, daß LINEIN das Format LineIn(name, line, count) hat. Beachten sie, daß ich "line" nicht verwendet habe. Da die Datei nicht geöffnet war, fing LineIn am Dateianfang an zu lesen und "count" bezeichnet die Anzahl der Zeilen, die ich einlesen wollte. Hier habe ich keine Zeilen gelesen, sondern nur die Datei geöffnet. Aye Bursche, schau in das Handbuch.

Was brauche ich noch ? Richtig! Irgendwo muß ich mir merken, wie viele Worte und Zeilen ich eingelesen habe. Und wenn wir gerade dabei sind, könnten wir auch gleich feststellen, welches die längste Zeile ist. (Warum ? Weil wir dann wissen, wie wir den Zeilenumbruch am besten bewerkstelligen). Wir werden mit den drei Zählern Counter, Allwords und Longline arbeiten und sie gleich mal auf Null setzen. Sie können das folgendermaßen machen:

'''Counter = 0; Allwords = 0; Longline = 0'''

Das Semikolon trennt jeweils die einzelnen Anweisungen voneinander.

Fassen wir also zusammen, was wir machen werden:

  • Eine Zeile einlesen
  • Die Worte in der Zeile zählen
  • Die Zeilenlänge feststellen und merken, wenn es die längste bisher gefundene Zeile ist.

Und so sieht das aus...

'''
Do While Lines(Filename) &lt &gt 0           /* 'Lines' arbeitet bis keine Zeilen mehr da sind. */
   Inp = Linein(Filename)               /* Inp enthält den Inhalt der Zeile */
   Y = Words(Inp)               	/* 'Words' liefert die Anzahl der Worte in der Zeile */
   Z = Length(Inp)              	/* 'Length' stellt fest, wie lang die Zeile ist */
   if Z > Longline then LongLine = Z    /* sie wissen schon... :-) */
   Counter = Counter + 1                /* Zähler erhöhen und        */
   Allwords = Allwords + Y      	/* die Anzahl der Worte in der Zeile speichern */
End /* do */
<br>
'''

Ok, wir haben alle diese Informationen zusammengesucht, was machen wir jetzt damit?

Nun, wir zeigen sie mit dem SAY Befehl an. Richtig, sie lesen meine Gedanken: Schlagen sie mal im Handbuch unter dem SAY Befehl nach. Einige Hinweise zum SAY Befehl: Das, was sie auf dem Bildschirm anzeigen möchten, muß in einfache (') oder doppelte (") Anführungszeichen eingeschlossen werden, mit Ausnahme von definierten Variablen. Wenn sie also diese Befehle in ihr Programm schreiben:

One = "Willkommen zu"
Two = "meinem"
Three = "Alptraum"
Say Eins Zwei Drei

Dann erscheint auf dem Bildschirm:

Willkommen zu meinem Alptraum

Wenn sie Eins, Zwei oder Drei nicht definiert haben, bekommen sie:

Eins Zwei Drei

Wenn sie das hier vorher gemacht hätten:

Eins = 1
Zwei = 2
Drei = 3
Say Eins + Zwei + Drei

würde ihr Programm anzeigen... nein, das würde ihnen ja den ganzen Spaß verderben.

Und so will ich das ganze verwenden: Zuerst müssen wir herausfinden, wie viele Seiten es gibt, indem wir die Anzahl der Zeilen durch 66 teilen. Sechundsechzig ist absolut willkührlich und ist eine Zahl, die ihren Ursprung weit in der Steinzeit hat, als Nadeldrucker üblicherweise nur 66 Zeilen auf einer Seite unterbringen konnten. Also definiere und berechne ich "Seite" so:

Seites = Trunc((Counter/66),1); If Seites = 0 Then Seites =
Trunc((Counter/66),2)

Das "Trunc" Kommando sorgt für eine handhabbare Anzahl Nachkommastellen. Die Zahl auf zwei Stellen abzuschneiden, wenn weniger als eine Seite Daten vorhanden ist, ist eigentlich Overkill. Andererseits... der Major bevorzugt Feuerkraft...

Nachdem wir das herausgefunden haben, schreibe ich noch folgendes:

Say Filename 'enthält 'Counter' Zeilen - das entspricht 'Seites' Seiten mit je 66 Zeilen.'
Say 'Die längste Zeile in der Datei ist 'LongLine' Zeichen lang. Es gibt '
Say AllWords' Worte in der Datei.'

Sicher werden sie die Datei, die sie geöffnet haben, auch wieder schließen wollen, also werde ich ihnen eine kleine Aufgabe geben, mit der sie sich beschäftigen können, anstatt nach Dienst die Schiffsenergie im Holodeck zu verbraten. (Ach, und wir haben dieses gewisse Programm gefunden...) Schauen sie sich mal den STREAM Befehl an.

Wenn sie mir bis hierhin folgen konnten und CountWords mit der README Datei laufen ließen, sollten sie ein Ergebnis bekommen haben, das etwa so aussieht:

 README enthält 851 Zeilen - das entspricht 12.8 Seiten mit je 66 Zeilen.
 Die längste Zeile in der Datei ist 74 Zeichen lang. Es gibt 3984 Worte in der Datei.
 

Oh, hoppla, das ist der Captain, sie müssen mich entschuldigen. Sie haben es vermutlich gehört - dieser Fisch, der aus dem Aquarium sprang und den Replikator kurzgeschlossen hat so daß er jetzt, wenn er nach Earl Grey verlangt, etwas eher in der Art eines Duke of Earl bekommt.

Bis zum nächsten Mal bleibe ich ihr

Major Weenie

Major Weenie ist Kent Rebman, ein Technischer Spezialist bei IBM. -ed