Hi,
Mir ist eingefallen, wie es mit einem Satz umschrieben werden könnte :)
Aah - das hilft!
Das Suchergebnis nach übereinstimmung mit dem Suchwort sortieren
(z.B. 100% oben 1% unten)
Du willst also eine ranking-Funktion verwenden. Na, sag das doch gleich. ;-)
Im Prinzip würde ich das in zwei Schritten tun:
1. Definiere Dir eine Funktion, welche als Ergebnis eines Vergleichs eines
Suchsbegriffs mit einer Zeile einen Zahlenwert liefert. Was "100%" be-
deutet, das zu definieren ist Deine Aufgabe - laß Deiner Phantasie freien
Raum.
2. Mache Dein normales foreach, aber erst mal nur zum Berechnen der Tref-
fer, nicht auch zum Ausgeben. Rufe dazu jeweils zum Vergleichen Deine
Funktion auf. Falls diese Funktion ein Ergebnis 0 liefert (das wäre
"keine Übereinstimmung", ignoriere die Zeile; andernfalls schreibe das,
was Du später über die Zeile wissen willst, als Wert in einen Hash, den
Du mit einem Schlüssel (siehe unten) adressierst:
if (my $ranking = ranking_value ($search_term, $fields))
{ $hash { key_generator($ranking) } = selected_fields ($fields); }
Dieser Schlüssel wird es sein, nach dem Du später mit
for my $this_key (sort keys %hash)
{ ausgabe ($hash {$this_key}); }
die Trefferanzeige erledigen wirst. Du mußt also sämtliche Treffer in
diesem Hash zwischenspeichern - das wird ggf. einiges an RAM kosten.
Dein Schlüssel muß zwei Eigenschaften erfüllen:
a) er muß sich in der von Dir gewünschten Art und Weise sortieren lassen
(ggf. kannst Du im obigen Code eine eigene Sortier-Funktion verwenden);
b) er muß eindeutig sein - auch dann, wenn Du zwei Treffer mit demselben
Ranking-Wert hast! (Andernfalls überschreibt der zweite Treffer näm-
lich den ersten in Deinem Hash, und der ist dann futsch.)
Letzteres löse ich üblicherweise dadurch, daß ich einen Schlüssel als
integer-Zahl so zusammenbaue, daß der Präfix das ranking und der Postfix
einen Tie-Breaker, also einen pro Treffer definitiv eindeutigen Wert,
enthält. Ein Beispiel dafür wäre:
$this_key = sprintf ("%10d-%10d", $ranking, $tie_breaker++);
wobei der Tie-Breaker einfach pro Anwendung um 1 erhöht wird. (Das ist
zwar ein bißchen Platzverschwendung, aber darüber mache ich mir wenig
Gedanken, wenn der Inhalt von $hash{$this_key} signifikant länger ist
als 20 Bytes.)
Viele Grüße
Michael