linux-l: perl und schnelle Suche

Ulrich Wiederhold U.Wiederhold at gmx.net
Fr Jun 15 20:34:23 CEST 2001


Hallo,
mein Problem ist, daß ich nach einem String in einer Datei suchen muß,
wobei Groß- und Kleinschreibung keine Rolle spielen soll.

Bsp.:
dies ist filename 1
dies iSt_filname 2
dieS_Ist` filename 3


suche nach "dies ist" soll alle 3 Einträge zurückgeben, auch die Suche
nach "ilNaMe" soll erfolgreich sein.

Problem ist nun, daß über 3 Anfragen pro Sekunde kommen können, was zu
einer hohen Auslastung der CPU führt (leider zu hoch). Mit grep
funktioniert es zwar, ist aber nicht mehr mit Perl gelöst.

Ich habe es auf 2 Wegen versucht.
1. Einlesen in ein hash, mittels
if (open(CONTENT, "<$listofpath")) {
    while (<CONTENT>){
    (my $underline_filename = $_) =~ tr/ /_/; #space durch _ ersetzen
    #spilt at / <- steht noch der Path davor, relevant ist aber nur der Filename
    my (@broken) = split /\//, $underline_filename;
    my $file = pop(@broken); #gets the late part of @broken, the filename
    chop $file;
    $locator_hash{lc $file} = $_;
    }
close CONTENT;
}

Suche dann mit:
$fts = lc($message); #get file to search, kleingeschrieben
$fts =~ tr/ /_/; #space durch _ ersetzen
my @result = ();
while (my ($key, $value) = each %locator_hash) {
 if ($key =~ /$fts/) {
     push (@result, $value);
 }
}


2. Mittels grep -e direkt in der Datei suchen:
my $file = '"' . $fts . '"' . ' -i ' . $listpath; #adds " around $file and $listofpath at the end
my @result = `grep -e $file`; #looks for the requested file in my list and put out the path


Hat jemand ne Idee, wie das effektiver geht? Perls grep-Funktion scheint
mit nicht geeignet, da ich dann erst eine Liste der keys erzeigen müßte,
was ja wohl noch langsamer wäre! (?)

Gruß
Uli

-- 
Ulrich Wiederhold
Clarenbachstraße 1
50931 Köln
phone +49-221-2766619



Mehr Informationen über die Mailingliste linux-l