Andre Muschter: Perl und ASCII-Dateien

Hallo, liebe Fachkollegen,

ich habe ein Perl-Skript, das aus einer ASCII-Datei zeilenweise Daten einlesen soll. Diese Daten sollen verwendet werden, um Code fuer eine HTML-Seite, die dann ueber den Browser angezeigt wird, zu generieren. Eigentlich nichts besonderes. Der entsprechende Perl-Code fuer das Oeffnen und Einlesen der ASCII-Datei lautet:

open(PHOTOFILE,'<photo.txt');
while(<PHOTOFILE>)
{
  ... (Aufbereiten der eingelesenen Zeilen-Daten)
}
close(PHOTOFILE);

Ich habe das Skript auf 3 verschiedenen Systemen auf jeweils 2 verschiedene Art und Weisen getestet:

Zum einen im Browser, indem das Skript ganz normal ueber eine HTML-Anweisung aktiviert bzw. direkt in der URL-Zeile angesprochen wird;
zum anderen ueber Telnet auf der Konsole, indem das Skript direkt mit der Perl-Anweisung und dem Skriptnamen abgearbeitet wird. Der generierte HTML-Code wird dabei auf dem Bildschirm ausgegeben.

ERGEBNISSE:
Das Skript laeuft in beiden Faellen ohne (sichtbare) Fehler durch.
ABER:
Wenn das Skript ueber den Browser (und somit auch ueber den Web Server!!) laeuft, wird der oben angegebene Perl-Code zum Aktivieren der ASCII-Datei und zum Einlesen dieser ignoriert.
Wenn das Skript ueber "Perl scriptname.pl" von der Konsole aufgerufen wird, wird der oben angegebene Perl-Code korrekt abgearbeitet, die ASCII-Datei eingelesen und die gewonnenen Daten im zu generierenden HTML-Code beruecksichtigt und auf dem Bildschirm ausgegeben.

Die erwaehnten 3 Systeme sind:

  • das System meines Providers (Linux, Apache)
  • mein System unter S.u.S.E. Linux 6.0, Perl 5.004, Apache 1.3.3
  • mein System unter Windows NT 4, ActivePerl 5.005 bzw. Perl 5.001, Internet Information Server 4

Und, wie gesagt, unter ALLEN 3 Systemen die gleichen KORREKTEN bzw. FEHLERHAFTEN Ergebnisse. Eine gewisse Systematik ist bei diesem Problem sicherlich nicht von der Hand zu weisen.
Verrueckt zudem, dass es unter beiden "Glaubensrichtungen" (Linux wie auch NT) und deren Peripherie (Perl, Web Server) anzutreffen ist.

Wer weiss, woran das liegen koennte?

Anmerkung:
Ich habe das Problem auch schon in mehreren CIS-Foren vorgestellt und viele Hinweise bekommen, die folgende Ergaenzung noetig machen:

  • Die Anweisung
      print "Content-type: text/html\n\n";
    ist im Skript enthalten.

  • Der Aufruf von Perl mit Schalter -w (Warnungen ausgeben) produziert KEINERLEI Fehlermeldungen im Web Server-Protokoll.

  • Der Fehler ist nicht nur Online, nicht nur unter einem bestimmten Betriebssystem, nicht nur unter einem bestimmten Web Server und nicht nur unter einem bestimmten Perl.

Er tritt immer auf, wenn das Gespann Browser/Web Server in Spiel kommt. Als ob da ein ganz BOESER Schalter im IIS4/Apache gesetzt ist, der das Einlesen von ASCII-Dateien verbietet.   ;-)

Viele Gruesse

Andre

  1. Moin Andre!

    Wenn das Skript ueber den Browser (und somit auch ueber den Web Server!!) laeuft, wird der oben angegebene Perl-Code zum Aktivieren der ASCII-Datei und zum Einlesen dieser ignoriert.

    Was heißt in diesem Zusammenhand 'ignoriert'? Spuckt der Server irgendeine Fehlermeldung aus oder passiert einfach gar nix?

    Auf die Gefahr hin, daß ich mich wiederhole <g> noch mal kurz, was beim Apache bzw. IIS zu beachten ist:

    • Apache

    Die allererste Zeile des Perl-Skriptes *muß*
    in etwa so aussehen

    #!/usr/bin/perl

    • IIS

    In der Registry folgendes suchen:

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3svc\Parameters\Script Map

    Dort dann einen Eintrag wie

    .pl   c:\perl\bin\perl.exe %s %s

    hinzufügen.

    Ferner müssen die Perl-Skripte in Verzeichnissen stehen, die für ausführbare CGI-Skripte extra vorgesehen sind (../cgi-bin/ ?!)

    Viel Erfolg beim Perlen...

    Andreas

    1. Hallo Andreas,

      vielen Dank fuer Deine schnelle Antwort.

      Was heißt in diesem Zusammenhand 'ignoriert'? Spuckt der Server irgendeine Fehlermeldung aus oder passiert einfach gar nix? »»

      Das Skript laeuft auf der Konsole und im Browser ohne sichtbaren Fehler durch.
      Bei der Ausfuehrung des Skripts ueber die Konsole wird mir der generierte HTML-Code auf dem Bildschirm angezeigt. Dieser Code entspricht meinen Wuenschen.
      Bei der Ausfuehrung des Skripts ueber den Browser wird mir ebenfalls der generierte HTML-Code in Form einer wunderschoenen dynamischen HTML-Seite angezeigt, nur fehlt in diesem Fall DER Teil an Informationen, der ueber das Einlesen der ASCII-Datei haette kommen muessen.

      Die allererste Zeile des Perl-Skriptes *muß*
      in etwa so aussehen

      #!/usr/bin/perl

      Tut sie.

      In der Registry folgendes suchen:
      HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3svc\Parameters\Script Map

      Dort dann einen Eintrag wie

      .pl   c:\perl\bin\perl.exe %s %s

      hinzufügen.

      Habe ich ueber die Management-Konsole erledigt. Perl wird auch korrekt aufgerufen. Skript laeuft ja durch. Siehe oben.

      Ferner müssen die Perl-Skripte in Verzeichnissen stehen, die für ausführbare CGI-Skripte extra vorgesehen sind (../cgi-bin/ ?!)

      Ist gemacht worden.

      Gibt es vielleicht in den Browsern Einstellungen/Schalter, die eine Behandlung (Oeffnen, Lesen, Schliessen) von ASCII-Dateien einschraenken?

      Wuerdest Du Dich mal fuer den Quelltext des Skriptes und der ASCII-Datei interessieren?

      Viele Gruesse

      Andre

      1. Hi!

        open(PHOTOFILE,'<photo.txt');

        Bei der Ausfuehrung des Skripts ueber den Browser wird mir ebenfalls der generierte HTML-Code in Form einer wunderschoenen dynamischen HTML-Seite angezeigt, nur fehlt in diesem Fall DER Teil an Informationen, der ueber das Einlesen der ASCII-Datei haette kommen muessen.

        Wenn das so ist, wird wahrscheinlich die ASCII-Datei gar nicht gefunden (Perl gibt dann nicht unbedingt eine Fehlermeldung aus!). Womöglich liegt Dein 'current-working-directory' irgendwoanders, wenn Du das Skript als CGI aufrufst. Probier doch mal, einen absoluten Pfad auf 'photo.txt' in den open-Befehl hineinzuschreiben.

        Andere Variante: Wenn 'photo.txt' im selben Verzeichnis wie das Skript liegen sollte, funktionierts wahrscheinlich deshalb nicht, weil /cgi-bin Verzeichnisse im allgemeinen nur ausführbar und nicht lesbar sind.

        Viele Grüße!

        Andreas

        1. Hallo Andreas,

          das Problem ist geloest.   :-))

          Wenn das so ist, wird wahrscheinlich die ASCII-Datei gar nicht gefunden (Perl gibt dann nicht unbedingt eine Fehlermeldung aus!). Womöglich liegt Dein 'current-working-directory' irgendwoanders, wenn Du das Skript als CGI aufrufst. Probier doch mal, einen absoluten Pfad auf 'photo.txt' in den open-Befehl hineinzuschreiben. <<

          Genau so ist es (WAR es).   :-))

          Also:

          Die ASCII-Datei befindet sich im DocumentRoot-Verzeichnis, das Skript steht darunter in cgi-bin.

          Die absoluten Verzeichnisse:
          /home/muschter/www/           fuer die ASCII-Datei
          /home/muschter/www/cgi-bin/   fuer das Skript

          Wenn das Skript im Browser ausgefuehrt wird, laueft es in /home/muschter/www/cgi-bin/. Die ASCII-Datei befindet sich aber 1 Etage hoeher, muss also mit "..\test.txt" aufgerufen werden.

          3 laecherliche Byte (..) also. <peinlich>

          Diese Konstellation ist natuerlich dann auf allen Systemen gegeben (Provider, Linux/Apache, NT/IIS).

          Das Skript lief von der Konsole korrekt, weil ich es aus dem DocumentRoot-Verzeichnis, in dem sich ja die ASCII-Datei befindet, mit relativer Pfadangabe (cgi-bin/test.pl) aufgerufen habe.

          Was soll ich noch fragen/sagen:

          Wieviel amateurmaessige Fehler sind noch erlaubt? (Habe allerdings auch ganz schoen gelitten!!)
          Vielen herzlichen Dank fuer Deine Unterstuetzung.

          Viele Gruesse an Dich von

          Andre