Engine Room - V1N3 (German)



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 Gagh 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 Gagh...

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: Und so sieht das aus... Do While Lines(Filename) <> 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 */ Ok, wir haben alle diese Informationen zusammengesucht, was machen wir jetzt damit?
 * 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.

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. Sechsundsechzig ist absolut willkürlich 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''