Suchergebnisse sortieren
Christoph Schnauß
- perl
hallo Forum,
ich habe ein kleines Problem mit einem Suchscript. Prinzipiell funktioniert es ganz gut, das heißt, es soll alle (HTML-) Dokumente eines vorgegebenen Verzeichnisses nach dem eingegebenen Suchbegriff durchkämmen. Das tut es. Aber bei der Ausgabe der Suchergebnisse gibts ein Problem: Ich möchte, daß in einer Tabelle links die anklickbaren Namen der Dateien, in denen die Suchergebnisse stehen, angezeigt werden, und rechts die zu diesen Dateien gehörenden <title>-Angaben. Für den Array mit den Dateinamen klappt es, das geschieht so:
$include{$name} = 'ja';
$link = "<a href="$baseurl/$name">$name</a>\n";
push(@links, $link);
aber was ich als Datei-Titel angezeigt bekomme, stimmt nicht zu den Dateinamen. Diese Festlegung erfolgt so:
foreach $key (keys %include) {
if ($include{$key} eq 'ja') {
$titel = "<li>$namen{$key}</li>\n";
push(@titel, $titel);
}}
Meine Annahme, daß die Reihenfolge der Elemente in @links und @titel damit identisch ist, stimmt nicht :-(
Ich habs mit allerhand Verrenkungen bei der Sortierung probiert, leider ohne brauchbares Ergebnis. Das Script ist zwar relativ klein und anspruchslos, aber für ein posting ist es mir zu lang. Ich habs mal auf http://www.christoph-schnauss.de/temp/suche.txt hochgeladen.
Natürlich ist jede andere Kritik am Script ebenfalls willkommen.
Grüße aus Berlin
Christoph S.
Hi,
Meine Annahme, daß die Reihenfolge der Elemente in @links und @titel damit identisch ist, stimmt nicht :-(
Hashes sind per se unsortiert. Was Du herausbekommst hat in der Reihenfolge nichts mit dem zu tun, was Du hineingetan hast. Suche eine andere Form der Speicherung; Du kannst z.B. in einem Array Listen oder Hashes speichern, die dann alle zum jeweiligen Dokument gehörenden Daten beinhalten.
Natürlich ist jede andere Kritik am Script ebenfalls willkommen.
Beim Überfliegen ist mir nichts Wesentliches aufgefallen; außer dass ich persönlich eine höhere Kapselung in Funktionen etc. anstatt eines "lauf einfach durch"-Codes bevorzuge. Die übliche Empfehlung (auch in perldoc perlstyle) für Einrückungen lautet übrigens auf vier Leerzeichen pro Ebene.
Cheatah
hallo Cheatah,
Hashes sind per se unsortiert. Was Du herausbekommst hat in der Reihenfolge nichts mit dem zu tun, was Du hineingetan hast. Suche eine andere Form der Speicherung; Du kannst z.B. in einem Array Listen oder Hashes speichern, die dann alle zum jeweiligen Dokument gehörenden Daten beinhalten.
Mir war nicht klar, wo ich mit der Sortierung ansetzen muß. Was ich probiert (und in dem hochgeladenen Beispiel wegen Unbrauchbarkeit wieder gestrichen) habe, geschah jeweils mit beiden Hashes.
Beim Überfliegen ist mir nichts Wesentliches aufgefallen; außer dass ich persönlich eine höhere Kapselung in Funktionen etc. anstatt eines "lauf einfach durch"-Codes bevorzuge.
Kritik akzeptiert ;-) Das verstehe ich gut, aber das wird bei mir meist erst dann gemacht, wenn mein Script insgesamt in einem "Arbeitsstadium" das richtig tut, was es tun soll.
Grüße aus Berlin
Christoph S.
hi Christoph
ich habe ein kleines Problem mit einem Suchscript. Prinzipiell funktioniert es ganz gut, das heißt, es soll alle (HTML-) Dokumente eines vorgegebenen Verzeichnisses nach dem eingegebenen Suchbegriff durchkämmen. Das tut es. Aber bei der Ausgabe der Suchergebnisse gibts ein Problem: Ich möchte, daß in einer Tabelle links die anklickbaren Namen der Dateien, in denen die Suchergebnisse stehen, angezeigt werden, und rechts die zu diesen Dateien gehörenden <title>-Angaben. Für den Array mit den Dateinamen klappt es, das geschieht so:
Vorschlag:
Speichere das Suchergebnis in einem hash like
key => Dateiname
value => title
Dann kannst du die Spalten anklickbar machen, so dass entweder nach Dateiname oder title sortiert werden kann.
Gruss, Erwin
hallo,
Vorschlag:
Speichere das Suchergebnis in einem hash like
key => Dateiname
value => title
Ich bin auf eine Kombination gekommen, die zu funktionieren scheint:
foreach $ausdruck (@ausdruecke) {
if (!($string =~ /$ausdruck/i)) {
$include{$name} = 'nein';
} else {
$include{$name} = 'ja';
}
if ($string =~ /<title>(.*)</title>/i) {
$namen{$name} = "$1";
} else {
$namen{$name} = "$name";
}}
foreach $key (keys %include) {
if ($include{$key} eq 'ja') {
$link = "<a href="$baseurl/$key">$key</a>\n";
$titel = "<li>$namen{$key}</li>\n";
push(@titel, $titel);
push(@links, $link);
}}
Ich glaube, du hast es etwas anders gemeint, und noch hab ich nicht ganz kapiert, wieso das jetzt zumindest die korrekte Zuordnung von Dateiname und Dateititel bringt.
Immerhin scheint damit erstmal das Wichtigste erledigt. Jetzt ist die Linkliste aber noch nicht sortiert. Die "Dateinamen" im durchsuchten Verzeichnis haben alle die Form "Zahl.htm" - also "1.htm" bis "n.htm" (das entspricht auch dem Datum, an dem sie entstanden sind). Angezeigt wird mir nun beispielsweise "7.htm, 4.htm, 53.htm, 22.htm ... n.htm". Ich möchte das gerne in der korrekten Reihenfolge haben, also "4.htm, 7.htm, 22.htm, 53.htm ... n.htm".
Grüße aus Berlin
Christoph S.