Hallo Doris
… werden die Dateien im Unterverzeichnis doppelt
ausgegeben - ist mir nicht klar, warum, ich komm nicht
drauf:frowning:
Ein „Logik-Fehler“ in der Implementierung (grep
gegen Verzichnisliste + Rekusrion in File::Find).
Im Grunde braucht man File::Find hier gar
nicht, es führt nur zu den beschriebenen
Problemen. Wenn man weiss, wo man sucht,
kann man die Verzeichnisse von Hand öffnen.
Das 2. Problem sind die Umlaute:
wenn ich z.B. nach „Gaststätte“ suche, lautet das Ergebnis:
Für das Suchwort Gastst\ätte gab es folgende
Ergebnisse:
- wobei es dann kein Ergebnis gibt, obwohl das Wort vorhanden
ist.
Wenn man „Gastst & a u m l ; tte“ eingibt (was ja aber niemand
macht!)[die Leerzeichen sind jetzt nur da, damit es hier
richtig angezeigt wird], kommt als Ergebnis:
Für das Suchwort Gastst\ä;tte gab es folgende
Ergebnisse:
- und die richtigen Seiten werden angezeigt.
Hmmm, hier wird es dann interessant. Da muss man
wohl mit ‚locale‘ arbeiten und sich genau überlegen,
was man wie vergleicht. Ich habe da eine Idee, wie
man das machen könnte (use encoding „iso8859-1“).
Man müsste erstmal alle Zeichen (incl. Umlaute)
auf eine Weise transformieren (z.B. in Kleinbuchstaben),
dass man später wieder gegen Kleinbuchstaben prüfen kann,
dazu gibt es diese p{CHAR}-Designatoren.
An dieser Stelle ist es sicher gut, das Progrämmchen
in einzelne Funktionen zu zerlegen, da hat man
dann schon mal ein paar subs, die man nicht mehr anzufassen
braucht. Ausserdem hab ich mit map{} um mich
geworfen, da das ein kompaktes Layout ermöglicht
Worum geht es bei Deinem problem eigentlich?
Intranet? Lokaler Rechner?
Achtung: wenn kein vorhanden ist,
gebe ich den absoluten Pfad aus.
Bei mir funktioniert das jetzt sogar ==>
use strict;
use encoding "iso8859-1";
use CGI qw();
use CGI::Carp('fatalsToBrowser', 'set\_message');
use File::Find; # braucht man nicht mehr
use HTML::Strip;
my $docroot = $ENV{DOCUMENT\_ROOT}; # truncate link path before output
my $pattern = qr/(?:\.html?|\.php\d?)$/i;
my @dirlist = qw{
E:/apache/xampp/htdocs/hautpverzeichnis
E:/apache/xampp/htdocs/hauptverzeichnis/unterverzeichnis
};
my $cgi = new CGI;
my $query = $cgi-\>param("query");
print $cgi-\>header(),
$cgi-\>start\_html(),
$cgi-\>p("Für das Suchwort $query gab es folgende Ergebnisse:");
$query =~ s/(\p{IsUpper}+)/lc $1/ge; # iso8859-1-Umlaute + Zeichen klein machen!
my @hits =
map $cgi-\>a( {href =\> $\_-\>{LINK}}, $\_-\>{TITLE} ), # 3) Links basteln
map processfiles( $\_, $pattern, $query, $docroot ), # 2) untersuchen und
@dirlist; # 1) Verzeichnisse
print $cgi-\>ol( $cgi-\>li( [@hits] ) ), $cgi-\>end\_html(); # ordered list, mit
# [@array] (CGI doku)
#####################
sub processfiles
{
my ($dir, $pattern, $query, $root) = @\_;
my ($title, @result);
for my $fname ( getdircontent($dir, $pattern) ) {
push @result, { LINK=\>$fname, TITLE=\>$title } # { Hash ref } erzeugen
if inspect( $fname, $query, \$title ) # wenn Hit erzielt
}
map { $\_-\>{LINK} =~ s/$root//i; $\_ } @result; # Liste mit ~htdoc/ };
close $fh;
$$t\_ref = $1 if $string =~ /(.+?)/si; # tatsaechlicher Titel
$string =~ s/(\p{IsUpper})/lc $1/ge; # iso8859-1 LC Transl.
my $bare = HTML::Strip-\>new()-\>parse( $string ); # Tags/Entities raus
return $bare =~ /$query/; # Suche ? 1 : 0
}
#####################
Grüße
CMБ