sunny: CGI am Webserver einrichten - Anfängerprobleme

Hallo Leute!

Ich versuch jetzt gerade zum ersten Mal ein Perl-Skript zu verwenden. Und zwar soll in eine Website eine Suchfunktion eingebaut werden, das lizenzfreie Perl-Skript dazu habe ich aus dem Internet.

Aber leider schaff ich es nicht, das Ganze zum Laufen zu bringen, da ich von CGI leider gar keine Ahnung habe (was sich hoffentlich bald ändern wird ;)

Mein Webserver ist übrigens ein IIS.

Ich hab den Perl-Interpreter von ActiveState heruntergeladen und installiert. Die Datei, die die Suche durchführen soll (search.cgi) hab ich in ein Verzeichnis namens cgi-bin gelegt und diesem die Ausführberechtigung erteilt. Als ich dann zum ersten Mal versucht habe, die Suche zu testen bekam ich folgende Fehlermeldung: %1 ist keine zulässige Win32-Anwendung.
Dann habe ich mich nochmals durch Selfhtml und IIS-Hilfe gewühlt und dann noch den Pfad zur Perl.exe für Dateien mit der Erweiterung .cgi hinzugefügt. Wenn ich jetzt aber die Suche testen will bekomm ich zwar keine Fehlermeldung mehr, dafür hängt sich mein Browser auf :(

Kann mir jemand einen Tip geben, ob ich was Wichtiges vergessen habe oder irgendetwas falsch konfiguriert haben könnte? Würde mich sehr über kleine Hilfen freuen!

Aber bitte nicht sagen "wer mit IIS arbeitet ist eh selber schuld". Ich hab keine andere Möglichkeit und ich denke, es müsste, wenn mans kann, auch mit IIS möglich sein ein Perl-Script zu verwenden ;)

Danke, lg,
sunny

  1. Hallo Sunny,

    ich weiß nicht, ob dir das irgendetwas hilft:
    Du könntest ActivePerl nochmal entfernen und es in der ISAPI-Fassung (kann man im Setup auswählen) neu installieren. Damit wird der IIS wohl eher zurecht kommen.

    Ich kenn mich mit dem IIS wirklich nicht aus! Das ist nur so eine Vermutung!

    Viele Grüße

    Patrick Canterino

    1. Hallo Patrick!

      ich weiß nicht, ob dir das irgendetwas hilft:
      Du könntest ActivePerl nochmal entfernen und es in der ISAPI-Fassung (kann man im Setup auswählen) neu installieren.

      Hab ich gemacht! Es hat sich aber nichts geändert. Irgendwann kommt dann ein Timeout zurück ...

      Trotzdem danke für den Tip!

      Lg,
      sunny

      1. Der Fehler liegt an dem Suchskript. Ich hab jetzt die Testdatei aus Selfhtml ausprobiert - es funktioniert!

        Lg,
        sunny

        1. Hallo!

          Jetzt hab ich aber noch eine Frage - in dem Perl-Skript, das ich zur Suche einbinde, müssen natürlich einige Dinge umgeändert werden.

          Weiß jemand, was hier "basedir" ist? Beispiel im Skript:

          Angabe des Basisverzeichnis

          $basedir = '/home/username/';

          baseurl usw. ist mir klar, aber welches Verzeichnis muss da bei basedir angegeben werden?

          Lg,
          sunny

          1. Hoi,

            Jetzt hab ich aber noch eine Frage - in dem Perl-Skript,

            Welches Perl-Script?

            Weiß jemand, was hier "basedir" ist? Beispiel im Skript:

            Angabe des Basisverzeichnis

            $basedir = '/home/username/';

            Das kann vieles sein. In diesem Zusammenhang vermute ich, dass soll das
            Basis-Verzeichnis der Domain sein.
            Allerdings wirst du schon den Autor anschreiben muessen, um das genau
            zu erfahren.

            Gruesse,
             CK

            1. Hallo,

              Angabe des Basisverzeichnis

              $basedir = '/home/username/';

              Das kann vieles sein. In diesem Zusammenhang vermute ich, dass soll das
              Basis-Verzeichnis der Domain sein.

              Bin der gleichen Meinung,

              Allerdings wirst du schon den Autor anschreiben muessen, um das genau
              zu erfahren.

              Ich nehme an, das Script befindet sich auf sunny's Webspace, dann musst du, sunny, nur in der Info deinen Webspaceproviders, wie dein Homeverzeichnis lautet.

              1. Hallo!

                Angabe des Basisverzeichnis

                $basedir = '/home/username/';

                Das kann vieles sein. In diesem Zusammenhang vermute ich, dass soll das
                Basis-Verzeichnis der Domain sein.

                Das Problem ist mittlerweile gelöst - der lokale Pfad zum Verzeichnis in dem die Dateien auf der Festplatte liegen hat gereicht! Fürs lokale Testen funktionierts erstmal - am Webserver muss ich dann eben den Pfad wieder ändern.

                Allerdings gibts schon wieder ein Problem. Es werden ja jetzt alle Dateien durchsucht, die in diesem Basisverzeichnis liegen, die eine bestimmte Dateierweiterung haben:

                Angabe des Basisverzeichnis

                $basedir = 'C:...\Final';

                Durchsuchbare Inhalte/Dateien

                @files = ('*.shtml','*.html','*.htm',
                 '*/*.shtml','*/*.html','*/*.htm',
                 '*/*/*.shtml','*/*/*.html','*/*/*.htm');

                Wie kann ich hier bestimmte Dateien oder Verzeichnisse ausschließen? Das müsste doch möglich sein, oder?

                Liebe Grüße,
                sunny

                1. Hi!
                  Du könntest alle nicht zu durchsuchenden Dateinamen in einen Array schreiben, und dann bei jeder zu überprüfen Datei kurz testen ob der aktuelle Dateiname im Array vorkommt - wenn nein OK, sonst weiter zur nächsten Seite!
                  Grüße
                  Andreas

                  1. Hallo!

                    Du könntest alle nicht zu durchsuchenden Dateinamen in einen Array schreiben, und dann bei jeder zu überprüfen Datei kurz testen ob der aktuelle Dateiname im Array vorkommt - wenn nein OK, sonst weiter zur nächsten Seite!

                    Ja, das erscheint logisch! Nur leider hab ich so gut wie gar keine Ahnung von Perl, das ist mein Problem. Da werd ich wohl nun doch nicht drum herumkommen, mich etwas einzuarbeiten, mit einer kleinen Modifizierung des Scripts wirds wohl nicht getan sein! Werd mal schauen, wie man in Perl Arrays macht und Bedingungen erstellt.

                    Und wenn ich dann wieder feststeck, meld ich mich wieder ;)

                    Eine Frage hätt ich allerdings noch: In dem Script wird eine HTML-Seite generiert, die Ergebnisseite. Da können aber keine Server Side Includes eingebaut werden, oder? Weil die Seite heißt ja nicht *.shtml sondern *.cgi. Zumindest werden meine SSI´s nicht angezeigt. Gibts da eine Möglichkeit, das zu umgehen oder _muss_ ich den externen Code, der eigentlich per SSI eingebunden werden soll, direkt einfügen?

                    Lg,
                    sunny

                    1. hi,

                      Eine Frage hätt ich allerdings noch: In dem Script wird eine HTML-Seite generiert, die Ergebnisseite. Da können aber keine Server Side Includes eingebaut werden, oder?

                      doch, prinzipiell geht das natürlich

                      Weil die Seite heißt ja nicht *.shtml sondern *.cgi.

                      HTML-Dokumente als CGI-Scripts auszugeben, ist eh ziemlich obskur. Dann gib deinem HTML-Dokument doch die Extension SHTML mit, und alles wird (hoffentlich) gut  -  was hindert dich daran?

                      Christoph S.

                      1. Hi Christoph,

                        Eine Frage hätt ich allerdings noch:
                        In dem Script wird eine HTML-Seite generiert,
                        die Ergebnisseite.
                        Da können aber keine Server Side Includes
                        eingebaut werden, oder?
                        doch, prinzipiell geht das natürlich

                        was heißt "generiert" an dieser Stelle?
                        a) ausgegeben (dann zweifele ich Christophs Antwort an)
                           oder
                        b) als Datei auf die Festplatte gespeichert?

                        Viele Grüße
                              Michael

                        1. Hallo!

                          was heißt "generiert" an dieser Stelle?
                          a) ausgegeben (dann zweifele ich Christophs Antwort an)
                             oder
                          b) als Datei auf die Festplatte gespeichert?

                          Ich hab gemeint ausgeben:

                          Es folgt die Ausgabe der Suchergebnisse:

                          print "Content-type: text/html\n\n";
                          print <<EOM;
                          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
                          <html>
                          <head>
                          ...

                          Es werden also im Script selbst die Suchergebnisse als HTML-Dokument ausgegeben.

                          Lg,
                          sunny

                          1. Hi sunny,

                            was heißt "generiert" an dieser Stelle?
                            a) ausgegeben (dann zweifele ich Christophs Antwort an)
                               oder
                            b) als Datei auf die Festplatte gespeichert?
                            Ich hab gemeint ausgeben:
                            Es werden also im Script selbst die Suchergebnisse als
                            HTML-Dokument ausgegeben.

                            dann relativiere ich Christophs Antwort zu:

                            Mit Apache 1.3 geht es nicht, die Ausgabe des CGI-Handlers noch
                            durch einen weiteren Handler (SSI) zu jagen - da mußt Du Deine
                            SSI-Anweisungen schon selbst auswerten (CGI ist mächtig genug
                            dafür).

                            Mit Apache 2.0 könnte es gehen - die Softwarearchitektur ist
                            jedenfalls prinzipiell dafür ausgelegt.

                            Viele Grüße
                                  Michael

                            1. hallo,

                              dann relativiere ich Christophs Antwort zu:

                              ich lasse mich gerne "relativieren" ;-)

                              Mit Apache 1.3 geht es nicht
                              Mit Apache 2.0 könnte es gehen - die Softwarearchitektur ist
                              jedenfalls prinzipiell dafür ausgelegt.

                              Apache 2.0.x unter WINDOWS tut es nicht (jedenfalls nicht bei mir). Apache 2.0.x unter LINUX oder *BSD tut es.

                              Meine "Prüfung" war aber noch nicht gründlich genug. Vielleicht kann ers doch noch unter WINDOWS.

                              Grüße

                              Christoph S.

                              1. Hallo Christoph,

                                Apache 2.0.x unter WINDOWS tut es nicht (jedenfalls nicht bei mir).

                                Dann hast du es nicht dementsprechend konfiguriert. Er kann das naemlich auch
                                unter Windows.

                                Gruesse,
                                 CK

                                1. hi Christian ;-)

                                  Apache 2.0.x unter WINDOWS tut es nicht (jedenfalls nicht bei mir).
                                  Dann hast du es nicht dementsprechend konfiguriert. Er kann das naemlich auch unter Windows.

                                  dann hast du meinen Hinweis

                                  Meine "Prüfung" war aber noch nicht gründlich genug. Vielleicht kann ers doch noch unter WINDOWS.

                                  nicht berücksichtigt.

                                  Mittlerweile kanns der Apache 2.0.36 bei mir auch unter Windows, ich hatte ja Zeit, die Konfiguration einzustellen.

                                  Grüße aus Berlin

                                  Christoph S.

                                  1. Guten Morgen!

                                    Schöne Diskussion habt ihr da ;)
                                    Allerdings hatte ich schon zu Beginn erwähnt, dass ich keine Möglichkeit habe, Apache zu verwenden, bei uns läuft IIS!

                                    Ich hab den Quellcode, den ich per SSI einbinden wollte mittlerweile direkt eingefügt.

                                    Allerdings hab ich immer noch das Problem mit dem Ausschließen bestimmter Dateien. Kann mir da vielleicht jemand weiterhelfen?

                                    Ich hab schon tausend (fast nicht übertrieben ;) Lösungen probiert, aber es will einfach nicht funktionieren.

                                    Aktueller Stand:

                                    Hier werden die Arrays definiert:

                                    Durchsuchbare Inhalte/Dateien

                                    @files=();
                                    for my $FileType('*.html','*.shtml')
                                    {for (0..16){
                                    push @files,(('*/' x $_).$FileType)}
                                    }

                                    Nicht zu durchsuchende Dateien

                                    @files_nicht = ('site/bestaetigung.shtml');

                                    Hier werden die Dateien ausgewählt bevor sie durchsucht werden:

                                    sub get_files
                                    {
                                     @Files=();
                                     for(@files)
                                     {
                                      push @Files,glob($_);
                                     }
                                     %Files=();
                                     for (@Files)
                                      {
                                       $Files{$_}=1;
                                      }
                                     for(@files_nicht)
                                      {
                                       delete $Files{$_} if $Files{$_};
                                      }
                                    }

                                    Allerdings bekomme ich gar keine Suchergebnisse mehr, auch Dateien, die durchsucht werden sollen werden nicht in den Ergebnissen aufgelistet.

                                    Das war der usprüngliche Code, mit dem alle Dateien durchsucht werden und mit dem ich auch korrekte Suchergebnisse bekomme:

                                    sub get_files
                                    {
                                     &bad_base unless (-e $basedir);
                                     chdir($basedir);
                                     foreach $file (@files)
                                     {
                                      # ls = ls $file;
                                      # @ls = split(/\s+/,$ls);
                                      @ls = glob $file;
                                      foreach $temp_file (@ls)
                                      {
                                       if (-d $file)
                                        {
                                        $filename = "$file$temp_file";
                                         if (-T $filename)
                                          {
                                           push(@FILES,$filename);
                                          }
                                        }
                                         elsif (-T $temp_file)
                                          {
                                           push(@FILES,$temp_file);
                                          }
                                        }
                                      }
                                    }

                                    Schön langsam weiß ich echt nicht mehr weiter, ich würd mich sehr über Hilfe freuen.

                                    Liebe Grüße,
                                    sunny

                                    1. Hallo,

                                      for my $FileType('*.html','*.shtml')
                                      {for (0..16){
                                      push @files,(('*/' x $_).$FileType)}
                                      }

                                      Wenn man das jetzt richtig formuliert, kommt dabei raus:

                                      for my $FileType ('*.html', '*.shtml') {
                                        for(0..16) {
                                          push @files, ('*/' x $_).$FileType;
                                        }
                                      }

                                      Was das soll, weiss ich aber nicht... du erstellst damit einen Array
                                      von Strings nach dem folgenden Muster:

                                      *.html
                                      */*.html
                                      */*/*.html
                                      ...

                                      Nicht zu durchsuchende Dateien

                                      @files_nicht = ('site/bestaetigung.shtml');

                                      Schneller ginge es mit
                                      $files_maynot = {
                                        'site/bestaetigung.shtml' => 1
                                      };

                                      @Files=();

                                      my @Files;

                                      for(@files)
                                      {
                                        push @Files,glob($_);
                                      }

                                      Jetzt verstehe ich, wofuer der Array of Strings oben gut sein sollte.
                                      IMHO eine sehr, sehr schlechte Loesung....

                                      %Files=();

                                      my %Files = ();

                                      for (@Files)
                                        {
                                         $Files{$_}=1;
                                        }
                                      for(@files_nicht)
                                        {
                                         delete $Files{$_} if $Files{$_};
                                        }

                                      Sinnvoller so:
                                      $files_maynot = {
                                        'site/bestaetigung.shtml' => 1
                                      };

                                      sub collect_files() {
                                        my @collected_files;
                                        foreach my $path (@files) {
                                          foreach my $file (glob($path)) {
                                            push @collected_files unless $files_maynot->{$file};
                                          }
                                        }

                                      return @collected_files;
                                      }

                                      Gruesse,
                                       CK

                                      1. Hallo!

                                        Was das soll, weiss ich aber nicht... du erstellst damit einen Array
                                        von Strings nach dem folgenden Muster:

                                        *.html
                                        */*.html
                                        */*/*.html
                                        ...

                                        So hatte ich das vorher auch, bis mir jemand, der versucht hat mir zu helfen, gesagt hat, anders wärs besser ... so scheiden sich die Geister ;)

                                        Nicht zu durchsuchende Dateien

                                        @files_nicht = ('site/bestaetigung.shtml');

                                        Schneller ginge es mit
                                        $files_maynot = {
                                          'site/bestaetigung.shtml' => 1
                                        };

                                        Ich erstell deswegen ein Array, weil da mehr Dateien hineinkommen sollen, nur zum Testen ist halt mal bloß diese eine darin enthalten!

                                        @Files=();

                                        my @Files;

                                        for(@files)
                                        {
                                          push @Files,glob($_);
                                        }

                                        Jetzt verstehe ich, wofuer der Array of Strings oben gut sein sollte.
                                        IMHO eine sehr, sehr schlechte Loesung....

                                        Ja ich hab leider überhaupt noch nie etwas mit Perl gemacht, daher tu ich mich so schwer damit, dieses Skript so hinzukriegen wie ich es haben möchte :(

                                        %Files=();

                                        my %Files = ();

                                        for (@Files)
                                          {
                                           $Files{$_}=1;
                                          }
                                        for(@files_nicht)
                                          {
                                           delete $Files{$_} if $Files{$_};
                                          }

                                        Sinnvoller so:
                                        $files_maynot = {
                                          'site/bestaetigung.shtml' => 1
                                        };

                                        sub collect_files() {
                                          my @collected_files;
                                          foreach my $path (@files) {
                                            foreach my $file (glob($path)) {
                                              push @collected_files unless $files_maynot->{$file};
                                            }
                                          }

                                        return @collected_files;
                                        }

                                        Danke für die Hilfe, das hilft mir schonmal weiter, allerdings funktionieren tuts immer noch nicht. Werd mal weiterbasteln ...

                                        Lg,
                                        sunny

                                        1. Hallo!

                                          Also jetzt hab ich das Script wieder soweit, dass es zumindest durchgeführt wird. Es sieht jetzt wie folgt aus:

                                          Durchsuchbare Inhalte/ Dateien

                                          @files = ('*.shtml','*.htm',
                                           '*/*.shtml','*/*.htm',
                                           '*/*/*.shtml','*/*/*.htm');

                                          Nicht zu durchsuchende Dateien

                                          $files_maynot = {
                                            'site/bestaetigung.shtml' => 1
                                          };

                                          ...

                                          sub get_files
                                          {
                                           my @Files;
                                           for(@files)
                                           {
                                            push @Files,glob($_);
                                           }
                                           my %Files = ();
                                           $files_maynot =
                                           {
                                            'site/bestaetigung.shtml' => 1
                                          };

                                          sub collect_files()
                                          {
                                            my @collected_files;
                                            foreach my $path (@files)
                                            {
                                              foreach my $file (glob($path))
                                           {
                                                push @collected_files unless $files_maynot->{$file};
                                              }
                                            }
                                          }
                                            return @collected_files;
                                          }

                                          sub search
                                          {

                                          Konvertiert mehrere Leerzeichen in eines:

                                          $FORM{'terms'} =~ s/\s+/ /g;
                                          $FORM{'terms'} = " $FORM{'terms'} ";

                                          Konvertiert NOT-Statements in  Minuszeichen:

                                          $FORM{'terms'} =~ s/ not / -/ig;

                                          Konvertiert AND-Statements in Pluszeichen:

                                          $FORM{'terms'} =~ s/ and / +/ig;

                                          OR-statements:

                                          $FORM{'terms'} =~ s/ or / /ig;

                                          Platzhalter:

                                          $check = 'true' unless ($FORM{'terms'} =~ /\*/);

                                          Gruppierte Einträge:

                                          @terms = split(/"/,$FORM{'terms'});
                                          $iterator = 0;
                                          $FORM{'terms'} = "";
                                          $placeholder = '%%%==%%%';
                                          foreach $term (@terms)
                                           {
                                           if ($iterator == 1)
                                            {$iterator--;}
                                           else
                                            {$iterator++;}

                                          $term =~ s/ /$placeholder/g unless $iterator;
                                           $FORM{'terms'} .= $term;
                                           }

                                          @terms = split(/\s+/,$FORM{'terms'});
                                          foreach $term (@terms)
                                           {
                                           next if ($term eq '');

                                          $term =~ s/$placeholder/ /g;

                                          if ($term =~ /^+/)
                                            {
                                            $term =~ s/+//o;
                                            $term = '\W' . $term. '\W' unless ($term =~ /^$/);
                                            $term =~ s/^$//;
                                            push(@required,$term);
                                            $required_terms_present = "you bet";
                                            }
                                           elsif ($term =~ /^-/)
                                            {
                                            $term =~ s/-//o;
                                            $term = '\W' . $term. '\W' unless ($term =~ /^$/);
                                            $term =~ s/^$//;
                                            push(@forbidden,$term);
                                            $forbidden_terms_present = "fraid so";
                                            }
                                           else
                                            {
                                            $term = '\W' . $term. '\W' unless ($term =~ /^$/);
                                            $term =~ s/^$//;
                                            push(@optional,$term);
                                            }
                                           }

                                          foreach $FILE (@FILES) ####### <==== Habs hier auch mit collected_files versucht!?
                                           {
                                          open(FILE,"$FILE");
                                          @LINES = <FILE>;
                                          close(FILE);
                                          $string = join(' ',@LINES);
                                          $string =~ s/\n//g;

                                          Extrahiert Titel, sofern vorhanden:

                                          if ($string =~ /<title>(.*)</title>/i)
                                           {
                                           $titles{$FILE} = $1;
                                           for ($i=1;$i<$title_x;$i++)
                                            {
                                            $string .= $titles{$FILE};
                                            }
                                           }
                                          $titles{$FILE} = $FILE unless $titles{$FILE};

                                          Extrahiert Beschreibung, sofern vorhanden:

                                          if ($string =~ /<meta\s+name="description"\s+content="(.*)>/i)
                                           {
                                           @cut = split(/">/,$1);
                                           $description{$FILE} = $cut[0];
                                           for ($i=0;$i<$description_x;$i++)
                                            {
                                            $string .= $description{$FILE};
                                            }
                                           }
                                          else
                                           {
                                           $string2 = $string;
                                           $string2 =~ s/<title>(.*)</title>//ig;
                                           $string2 =~ s/<([^>]|\n)*>//g;
                                           @words = split(/\s+/,$string2);
                                           for ($i=0;$i<25;$i++)
                                            {$description{$FILE} .= "$words[$i] ";}
                                           $description{$FILE} .= "...";
                                           }

                                          Es werden aber keine Dateien mehr durchsucht - das heißt ich bekomm kein Suchergebnis, auch wenn Seiten zu den gesuchten Begriffen vorhanden sind.

                                          Ich würd mich wirklich freuen, wenn Du mir da noch weiterhelfen könntest, ich plag mich schon seit 3 Tagen damit herum, aber ich schaff es einfach nicht. :(

                                          Liebe Grüße,
                                          sunny

                                          1. Hi sunny,

                                            Es werden aber keine Dateien mehr durchsucht -
                                            das heißt ich bekomm kein Suchergebnis, auch
                                            wenn Seiten zu den gesuchten Begriffen
                                            vorhanden sind.

                                            ich würde vorschlagen, an diversen Stellen Test-
                                            ausgaben einzubauen:

                                            • Werden Deine Abfragen alle so ausgeführt, wie Du
                                                das willst?
                                            • Stehen in Deinen Variablen die Werte drin, die
                                                Du dort erwartest?
                                              Debugging ist harte Arbeit - aber je mehr Du siehst,
                                              desto eher schaust Du an die richtige Stelle.

                                            Viele Grüße
                                                  Michael

                                            1. Hallo!

                                              ich würde vorschlagen, an diversen Stellen Test-
                                              ausgaben einzubauen:

                                              • Werden Deine Abfragen alle so ausgeführt, wie Du
                                                  das willst?

                                              Das werden sie leider nicht, das ist ja mein Problem ;)

                                              • Stehen in Deinen Variablen die Werte drin, die
                                                  Du dort erwartest?

                                              Ja.

                                              Debugging ist harte Arbeit - aber je mehr Du siehst,
                                              desto eher schaust Du an die richtige Stelle.

                                              Mein Problem ist, dass ich das Script teilweise nicht ganz verstehe und es daher (für mich) total schwierig ist, es umzubauen. Vor allem auch weil ich von allen Seiten andere Tips bekomme und mich selber mit Perl bis vor 3 Tagen noch nie beschäftigt hatte.

                                              Viele Grüße,
                                              sunny

                                              1. Hi sunny,

                                                Mein Problem ist, dass ich das Script teilweise
                                                nicht ganz verstehe und es daher (für mich) total
                                                schwierig ist, es umzubauen.

                                                das kann ich Dir nachempfinden. Ich schreibe auch
                                                lieber Code selber, als fremden Code zu lesen.

                                                Wenn Du es aber nicht selbst machen willst, dann
                                                'übernimm' den Code. Kommentiere ihn! Schreibe an
                                                jede Zeile hin, was sie tut, warum sie da ist.
                                                Arbeite Dich Zeile für Zeile ein - durch diese
                                                Kommentare siehst Du, wo Du noch Lücken hast.

                                                Und eine derrartige kommentierte Version des
                                                Quelltextes wäre für andere Leser, die Dir helfen
                                                wollen, ebenfalls nützlich.
                                                Einerseits sehen diese dann nämlich, wie das
                                                Programm arbeitet, und andererseits sehen sie,
                                                ob Deine Kommentare korrekt sind! Wenn Du an eine
                                                Anweisung schreibst, daß Du von ihr etwas Bestimmtes
                                                erwartest, was sie aber nicht tut, dann läßt sich
                                                ein solcher Denkfehler auch von jemandem leicht
                                                finden, der einfach nur gut Perl kann - ohne daß
                                                dieser dafür das gesamte Skript so detailliert
                                                durcharbeiten muß wie Du selbst, der Du ja ggf.
                                                später noch eigene Änderungen einbauen willst.

                                                Vor allem auch weil ich von allen Seiten andere
                                                Tips bekomme

                                                Das liegt nicht zuletzt daran, daß Du eine "Lösung"
                                                für ein Problem geliefert hast, die erstens zu
                                                keiner sauber definierten Aufgabenstellung gehört
                                                und zweitens technisch suboptimal gemacht ist, wie
                                                Christian ja bereits gezeigt hat. Da weiß man oft
                                                gar nicht, wo man mit dem Verbessern anfangen soll.

                                                Wahrscheinlich wäre es wirklich das Einfachste,
                                                den gesamten Programmteil wegzuwerfen und neu zu
                                                schreiben. Dafür jedoch wäre eine _exakte_ Auf-
                                                gabenstellung notwendig - und diese müßte inbeson-
                                                dere so detailliert sein, daß sie die Zusammenarbeit
                                                zwischen diesem Programmteil und seiner Umgebung
                                                _vollständig_ beschreibt.
                                                Eine solche Aufgabenstellung zu schreiben ist
                                                oftmals aufwändiger als das Programmieren selbst!

                                                und mich selber mit Perl bis vor 3 Tagen noch
                                                nie beschäftigt hatte.

                                                Dann erwarte einfach nicht, daß Du nach 3 Tagen zu
                                                irgendwelchen zählbaren Erfolgen kommst.

                                                Gerade das Finden eines Fehlers hat viel mit Erfah-
                                                rung zu tun - und auch mit methodischem Vorgehen.
                                                Deshalb habe ich Dir empfohlen, an möglichst vielen
                                                Stellen Testausgaben einzufügen.
                                                Verlaß Dich auf nichts! Vertraue keiner einzigen
                                                Anweisung! Prüfe jede einzelne Zeile und isoliere
                                                somit den fehlerhaften Bereich, so gut es geht.
                                                Je kleiner das verbleibende Code-Stück ist, desto
                                                leichter siehst Du, warum was nicht funktioniert.

                                                Viele Grüße
                                                      Michael

                                          2. Hallo,

                                            Hier fehlt ein 'use strict;'

                                            Durchsuchbare Inhalte/ Dateien

                                            @files = ('*.shtml','*.htm',

                                            Hier ein 'my'.

                                            '*/*.shtml','*/*.htm',
                                            '*/*/*.shtml','*/*/*.htm');

                                            Nicht zu durchsuchende Dateien

                                            $files_maynot = {
                                              'site/bestaetigung.shtml' => 1
                                            };

                                            Hier auch ein 'my'.

                                            sub get_files

                                            Das kann weg.

                                            sub collect_files()
                                            {
                                              my @collected_files;
                                              foreach my $path (@files)
                                              {
                                                foreach my $file (glob($path))
                                            {
                                                  push @collected_files unless $files_maynot->{$file};
                                                }
                                              }
                                            }
                                              return @collected_files;
                                            }

                                            Das ist -- abgesehen von der Formatierung -- ok so.

                                            Du musst den Array '@FILES' ja auch irgendwie fuellen, ne? Das
                                            tut collect_files():

                                            my @FILES = collect_files();

                                            foreach $FILE (@FILES) ####### <==== Habs hier auch mit collected_files versucht!?
                                            {
                                            open(FILE,"$FILE");

                                            open FILE, "<$FILE" or die $!;

                                            @LINES = <FILE>;

                                            {
                                              local $/;
                                              $line = <DAT>;
                                            }

                                            close(FILE);

                                            close FILE or die $!;

                                            $string = join(' ',@LINES);

                                            Kann weg.

                                            So sollte es laufen.

                                            Es werden aber keine Dateien mehr durchsucht - das heißt ich
                                            bekomm kein Suchergebnis, auch wenn Seiten zu den gesuchten
                                            Begriffen vorhanden sind.

                                            Kein Wunder -- du hattest den Array '@FILES' ja auch leer.

                                            Gruesse,
                                             CK

                                            1. Also erstmal danke für die viele Hilfe.

                                              Leider bekomm ich es trotzdem nicht hin.

                                              Habs jetzt so:

                                              sub collect_files()
                                              {
                                                my @collected_files;
                                                foreach my $path (@files)
                                                {
                                                  foreach my $file (glob($path))
                                               {
                                                    push @collected_files unless $files_maynot->{$file};
                                                  }
                                                }
                                              }
                                                return @collected_files;
                                              }

                                              my @FILES = collect_files();

                                              ...

                                              foreach $FILE (@FILES)
                                              {
                                              open FILE, "<$FILE" or die $!;
                                              {
                                                local $/;
                                                $line = <DAT>;
                                              }
                                              close FILE or die $!;
                                              $string =~ s/\n//g;

                                              Gehört da nicht noch ne "}" ? Funktioniert aber auch damit nicht.

                                              Fehlermeldung: Script produced no output

                                              Schön langsam kenn ich mich überhaupt nicht mehr aus, sorry :(

                                              1. Hallo,

                                                Leider bekomm ich es trotzdem nicht hin.

                                                *seufz*
                                                Ich befuerchte, du spielst noch in einer anderen Liga....

                                                Vorschlag: schick mir das Ding mal per EMail an
                                                mailto:ckruse@wwwtech.de (nicht an CK1@wwwtech.de, da wuerde
                                                sie mit einem Anhang direkt in den Muelleimer gehen). Dann korrigiere
                                                ich heute abend die Fehler und poste hier nochmal das Ergebnis,
                                                inkl. einer Erklaerung, warum was wo und wie passiert. Wird aber wohl
                                                so 8 Uhr werden... *viel zu tun hat*

                                                Gruesse,
                                                 CK

                                                1. ....

                                                  Vorschlag: schick mir das Ding mal per EMail an
                                                  mailto:ckruse@wwwtech.de (nicht an CK1@wwwtech.de, da wuerde
                                                  sie mit einem Anhang direkt in den Muelleimer gehen). Dann korrigiere
                                                  ich heute abend die Fehler und poste hier nochmal das Ergebnis,
                                                  inkl. einer Erklaerung, warum was wo und wie passiert. Wird aber wohl
                                                  so 8 Uhr werden... *viel zu tun hat*

                                                  Ehrlich? Das find ich wirklich super von Dir! Danke!
                                                  Ich muss jetzt leider auch weg, aber ich werd mir alles nach Hause schicken, damit ich am WE weitermachen kann. Und ich werd heut Abend wieder da sein.

                                                  Lg,
                                                  sunny

                                                2. Hallo Christian!

                                                  Hast Du mein E-mail mit dem Script erhalten? Habs am Freitag kurz vor 5 noch weggeschickt.

                                                  Lg,
                                                  sunny

                                        2. Hi sunny,

                                          Nicht zu durchsuchende Dateien

                                          @files_nicht = ('site/bestaetigung.shtml');
                                          Schneller ginge es mit
                                          $files_maynot = {
                                            'site/bestaetigung.shtml' => 1
                                          };
                                          Ich erstell deswegen ein Array, weil da mehr Dateien
                                          hineinkommen sollen

                                          auch in den von Christian vorgeschlagenen hash kannst
                                          Du viele Dateien eintragen.

                                          Aber während Du bei Verwendung des Array diesen für
                                          jeden Dateinamen komplett durchsuchen mußt, kannst
                                          Du bei Verwendung des Hashes direkt prüfen, ob der
                                          passende Eintrag für die Datei $x gesetzt ist, mit

                                          if (defined ($files_maynot {$x})) {
                                                  # diese Datei nicht verarbeiten
                                                }

                                          Das ist vor allem viel weniger Arbeit für den Rechner

                                          • aber auch weniger Code in Deinem Programm und damit
                                            sowohl besser überschaubar als auch weniger fehler-
                                            anfällig.

                                          Viele Grüße
                                                Michael

                                          1. Hallo Michael,

                                            if (defined ($files_maynot {$x})) {
                                                    # diese Datei nicht verarbeiten
                                                  }

                                            Kleine Verbesserung:

                                            if(exists $files_maynot->{$x}) {
                                              # diese Datei nicht verarbeiten
                                            }

                                            'defined' ist in diesem Fall das falsche Schluesselwort, wir wollen ja
                                            wissen, ob der Eintrag vorhanden ist. Und das macht 'exists'.

                                            Gruesse,
                                             CK

                                            1. Hi Christian,

                                              'defined' ist in diesem Fall das falsche Schluesselwort, wir wollen ja
                                              wissen, ob der Eintrag vorhanden ist. Und das macht 'exists'.

                                              seufz - ich sollte wirklich keinen konkreten Code
                                              mehr posten ... danke für die Verbesserung.

                                              Viele Grüße
                                                    Michael

                                  2. Moinmoin Christoph,

                                    dann hast du meinen Hinweis

                                    Meine "Prüfung" war aber noch nicht gründlich genug. Vielleicht
                                    kann ers doch noch unter WINDOWS.
                                    nicht berücksichtigt.

                                    Doch, habe ich -- deshalb habe ich das hier ja gepostet. Sieh es als
                                    Aufklaerungsarbeit ;-)

                                    Gruesse,
                                     CK

                        2. hallo Michael,

                          was heißt "generiert" an dieser Stelle?
                          a) ausgegeben (dann zweifele ich Christophs Antwort an)

                          womit du recht hättest

                          b) als Datei auf die Festplatte gespeichert?

                          ich habe gar nicht an Möglichkeit a) gedacht. Aber bei Möglichkeit b) trifft meine Aussage im wesentlichen zu

                          Grüße aus Berlin

                          Christoph S.

                          1. Hallo Christoph,

                            was heißt "generiert" an dieser Stelle?
                            a) ausgegeben (dann zweifele ich Christophs Antwort an)
                            womit du recht hättest

                            Wie immer: it depends. Mit dem Apache 2.0 sollte es eigentlich moeglich sein,
                            dem Filter-Konzept nach zumindest auf jeden Fall.

                            Gruesse,
                             CK

                2. Hallo!

                  Also ich hab jetzt einen Lösungsansatz für das Problem (es sollen ja bestimmte Seiten von der Suche ausgeschlossen werden).

                  Ich erstelle gleich zu beginn zwei Arrays:

                  Durchsuchbare Inhalte/ Dateien

                  @files = ('*.shtml','*.htm',
                   '*/*.shtml','*/*.htm',
                   '*/*/*.shtml','*/*/*.htm');

                  Nicht zu durchsuchende Dateien

                  @files_nicht = ('site/bestaetigung.shtml'); # Nur mal ein Beispiel

                  Und dann weiter unten hab ich folgenden Code eingebaut/umgeändert:

                  sub get_files
                  {
                  &bad_base unless (-e $basedir);
                  chdir($basedir);
                  foreach $file (@files)
                   {
                    $file_ok = 1;
                    foreach $temp ($files_nicht)
                   {
                    if ($temp eq $temp_file || $temp eq $file)
                    {
                     $file_ok = 0;
                    }
                   }

                  if (-d $file && file_ok == 1)
                   {
                    $filename = "$file$temp_file";
                    if (-T $filename)
                    {
                     push(@FILES,$filename);
                    }
                   }
                   elsif (-T $temp_file && file_ok == 1)
                   {
                    push(@FILES,$temp_file);
                   }
                  }
                  }

                  Allerdings bekomme ich nun überhaupt keine Suchergebnisse mehr, es werden auch die Seiten nicht durchsucht, die nicht im Array files_nicht enthalten sind. Warum? Sieht hier jemand den Fehler?

                  Vielen Dank,
                  sunny

                  1. Hi sunny,

                    Durchsuchbare Inhalte/ Dateien

                    @files = ('*.shtml','*.htm',
                    '*/*.shtml','*/*.htm',
                    '*/*/*.shtml','*/*/*.htm');

                    enthält Deine Aufgabenstellung eine solche strikte Limitierung auf drei Ebenen, statt eine komplette
                    rekursive Verarbeitung eines kompletten Baums?

                    Falls nicht, wäre Dein Problem wahrscheinlich
                    übersichtlicher zu lösen (Lesetip: File::Find).

                    foreach $file (@files)
                    {
                      $file_ok = 1;
                      foreach $temp ($files_nicht)
                    {
                      if ($temp eq $temp_file || $temp eq $file)

                    Was soll $temp_file sein?
                    Wo bekommt diese Variable überhaupt einen Wert her?

                    {
                       $file_ok = 0;
                      }
                    }

                    Genau diesen kompletten Block hättest Du bei
                    Verwendung eines Hashes durch eine einzige Abfrage
                    ersetzen können.

                    Ich verstehe allerdings nicht, was Du da tust.
                    $temp mag beispielsweise einen Dateinamen enthalten,
                    sagen wir mal 'site/bestaetigung.shtml'.
                    Aber der wird niemals _identisch_ zu einem Eintrag
                    aus @files sein! Mit 'eq' machst Du keinen Muster-
                    vergleich, sondern einen String-Vergleich.

                    if (-d $file && file_ok == 1)

                    Das wird also immer wahr sein - oder nie, je nachdem,
                    was in $temp_file drin steht.

                    Ich habe Deine Aufgabenstellung nicht verstanden -
                    aber ich kann mir nicht vorstellen, daß die Methode,
                    in @files eine statische Liste von Mustern zu halten
                    und diese dann umständlich weiter zu verarbeiten,
                    geschickter sein soll, als rekursiv den gesamten
                    Baum unterhalb von $basedir zu verarbeiten.

                    Viele Grüße
                          Michael

                    1. Hallo!

                      enthält Deine Aufgabenstellung eine solche strikte Limitierung auf drei Ebenen, statt eine komplette
                      rekursive Verarbeitung eines kompletten Baums?

                      Nein, das ist ein lizenzfreies Skript das ich verwende. Ich habs nicht selber geschrieben. Schön wärs wenn ich das könnte, dann hätte ich wohl nicht solche Probleme mit dem Ding ;)

                      Ich verstehe allerdings nicht, was Du da tust.

                      Ich verstehs auch nicht mehr ... leider.

                      $temp mag beispielsweise einen Dateinamen enthalten,
                      sagen wir mal 'site/bestaetigung.shtml'.
                      Aber der wird niemals _identisch_ zu einem Eintrag
                      aus @files sein! Mit 'eq' machst Du keinen Muster-
                      vergleich, sondern einen String-Vergleich.

                      Das heißt? Es ist alles verkehrt!? Das Original-Skript, in dem das so drinnensteht, hat aber funktioniert. Solange ich einfach alle Verzeichnisse (bis auf drei Ebenen wie Du ja bemerkt hast) aus dem Basisverzeichnis durchsuche ohne irgendwelche Einschränkungen funktioniert alles einwandfrei.

                      Das wird also immer wahr sein - oder nie, je nachdem,
                      was in $temp_file drin steht.

                      Hmmm ... ?

                      Ich glaub ich gebs bald auf ... aber irgendwie muss ich das doch hinkriegen, das Skript so umzubauen dass eben nicht alle Dateien durchsucht werden!?

                      Eure verzweifelnde sunny