Trick 67:
Schnellzählung
Wieviele Einträge
sind im Index unter xyz?
Aufgabe: Hurtig mal
prüfen, wieviele Einträge es z.B. im Register 3
unter xyz gibt. Anspruchsvolle wollen noch mehr:
Wieviele Einträge gibt es, die mit xyz beginnen?
Warum: Man will vielleicht in einem
FLEX prüfen, ob es im Index unter
irgendeinem Kriterium überhaupt schon etwas gibt, und wenn ja,
wieviele Zeilen. Das kann z.B. die Anzahl der Ausleihen eines
Lesers sein, oder die Anzahl von Heften zu einer Zeitschrift.
Oder: Hat dieser Satz verknüpfte Untersätze und wieviele?
(Die erste Frage ist auch mit if main beantwortbar!)
Solche Einträge haben immer eine bestimmte Struktur, sind also
in Index an einer Stelle versammelt. Mit bloßem Auge sieht ja
jeder sofort, wieviele Treffer es da gibt - kann FLEX das auch?
Lösung:
Das geht mit dem Befehl "qrix". Den
gibt es schon lange, aber man
findet nicht so leicht raus,
daß der solche Sachen kann. Wie soll man
auch wo nach dieser Funktion
suchen? (Sagen Sie uns, wie und wo Sie
gesucht und es nicht gefunden
haben! Wir richten das dann.)
Geben Sie mal bei der DemoBank ein:
x qrix 1 per shak\mes
Es erscheint die
Mitteilung "74 shakespeare, william"
Und jetzt:
x qrix 1 per shak?\mes
Dann kommt die Meldung
"274 shak"
Dasselbe sehen Sie mit bloßem
Auge im Personenregister, wenn Sie
zu der Stelle shak
gehen bzw. dann mal shak? eintippen.
Das Rezept ist also ganz klar:
qrix 1 abc xyz
liefert in der internen Variablen
genau die Registerzeile, die man
haben will. abc ist der symbolische
Name des Registers, xyz ist die
Stelle bzw. der Anfang davon, wenn
man mit ? trunkiert.
Die 1 hinter dem "qrix" ist die
Anzahl Zeilen, die man haben will!
Mit einer Zahl >1 kriegt man
entsprechend viele Zeilen in die iV,
getrennt durch den Code 20. Das
braucht man weniger oft.
Läßt man aber die Zahl
ganz weg, gibt's gleich 20 Zeilen!
Nun aber die Frage: Wenn xyz im
Register gar nicht auftritt?
Dann kriegt man die Zeile, die
genau an der Stelle steht, wo xyz
stehen müßte und nicht
steht.
Und wie kann man diesen Sachverhalt
im FLEX prüfen, d.h. daß es
die gesuchten Einträge nicht
gibt?
Sagen wir, Zeilen mit "shakesp"
werden gesucht, und man will prüfen,
ob welche vorkommen, bevor man
weitermacht im FLEX.
Hier ist das Strickmuster:
qrix 1 per
shakesp
var (f" " b"
" f" ")
if not
="shakesp" jump nix
....
:nix
mes es gibt
keine Zeilen an der Stelle!
Die komische Zeile var (f" "
b" " f" ") beseitigt am Anfang der
Zeichenfolge, die sich in der iV
befindet, die Leerzeichen, dann die
Zahl, dann die evtl. noch folgenden
Leerzeichen vor dem Text. Übrig
bleibt der Text! Und der
läßt sich dann mit ="shakesp" vergleichen,
also mit dem, was man haben
wollte...
-----------------------------------------------------------------------
Und nun noch die Frage: Wieviele
verkn. Untersätze?
var p
if "" mes
Kein Prim.Schl.!;end
var "1 |9 " p
"+?"
qrix
eval
ins #uvk
var "Es gibt
" #uvk " verkn. Untersätze"
mes
Hier werden also die Angaben
für qrix per var-Befehl zusammengestellt,
die Zahl aus der dann in iV
befindlichen Indexzeile per eval ermittelt.
-----------------------------------------------------------------------
Übrigens: Statt des
symbolischen Namens geht auch die übliche
Bezeichnung |1 für Register 1
usw., also z.B.
x qrix 1 |3
shak?\mes
um im Register 3 die Stelle "shak"
abzuprüfen.