Roland Plank: Keine Anzeige

Hallo,

meine meisten CGI-Skripte werden auf dem öffentl. Webserver nicht angezeigt, d.h., ich habe einen weißen Bildschirm und keinerlei Fehlermeldungen. Auf meinem lokalen Webserver läuft alles bestens.
Die Skripte werden ausgeführt.
Der Pfadname stimmt, die Rechte stimmen, es gibt keine Fehlermeldung.
Folgendes einfache Skript:

#!/usr/local/bin/perl -w

print "Content-type:text/html\n\n";

use CGI::Carp(fatalsToBrowser);

$file = "add.html";
open(INFO, $file) or die 'Konnte Datei nicht oeffnen';
@lines = <INFO>;
close(INFO);
print @lines;

Was mache ich da falsch.

Danke im Voraus.

Roland

  1. guten abend,

    meine meisten CGI-Skripte werden auf dem öffentl. Webserver nicht angezeigt, d.h., ich habe einen weißen Bildschirm und keinerlei Fehlermeldungen.

    Also wird DOCH ! etwas angezeigt. Es hat lediglich keinen Inhalt.

    Auf meinem lokalen Webserver läuft alles bestens.

    Das wage ich zu bezweifeln.

    Ich halte diese Zeilen für problematisch, weil zu kurz:

    open(INFO, $file) or die 'Konnte Datei nicht oeffnen';
    @lines = <INFO>;
    close(INFO);
    print @lines;

    Was mache ich da falsch.

    Du läßt @lines ausgeben, ohne das vorher zu splitten. Bei mir funktioniert in einem Forumscript (stark verkürzt) folgendes:

    open(MAIN,"$basedir/$mainfile") || die $!;
       @main = <MAIN>;
       close(MAIN);
       ...
       open(MAIN,">$basedir/$mainfile") || die $!;
          foreach $main_line (@main) {
            ...
            ...
            print MAIN "$main_line";
          }

    Du siehst, was passiert? Mit dem ersten "open" wird, genauso wie bei dir, eine Datei (meine "Forumshauptdatei") geöffnet und ihr Inhalt in einen Array kopiert. Danach wird sie vorsichtshalber wieder geschlossen.
    Mit dem zweiten "open" wird dieselbe Datei erneut geöffnet, jetzt aber zur Bearbeitung. In einer Schleife wird festgelegt, was mit jeder einzelnen Zeile, die im vorhin erzeugten Array steht, geschehen soll, schließlich wird Zeile für Zeile die Datei neu geschrieben.

    Christoph S.

    1. Hallo,

      Ich halte diese Zeilen für problematisch, weil zu kurz:

      open(INFO, $file) or die 'Konnte Datei nicht oeffnen';
      @lines = <INFO>;
      close(INFO);
      print @lines;

      Im Gegenteil, viel zu lang:[1]
      open(INFO, $file) or die "Konnte Datei $file nicht oeffnen:$!";
      print while(<INFO>);
      close INFO or die "Konnte Datei $file nicht schliessen:$!";

      Was mache ich da falsch.
      Du läßt @lines ausgeben, ohne das vorher zu splitten.

      Daran kanns nicht liegen.
      Wenn das Script aus dem Original-Posting keinen Text zurückliefert, dann müßte add.html leer sein.

      Es könnte auch an einem eventuell installierten mod_perl liefen, das bekanntlich recht eigenartige Sachen anstellt, wenn man ohne 'use strict' arbeitet.

      Oder aber auch an dem verwendeten Browser, der den Inhalt aus irgendeinem Grund aus dem eigenen Cache anstelle vom Server holt.

      Grüße
        Klaus

      [1] Ich halte es übrigens für eine wirkliche Unsitte, Dateien immer nach dem Schema
      open IN, $dateiname;
      @inhalt = <IN>;
      close IN;
      ...

      zu verarbeiten. Gerade in diesem Falle kann es potentiell zu Problemen mit der Speicherauslastung kommen, wenn beispielsweise viele Requests gleichzeit mit großen Dateien bedient werden müssen.
      Da wird dann der Dateiinhalt sinnloserweise zuerst in ein Array geladen, welches alleine nur zum Zweck dient, wiederum auf STDOUT geschrieben zu werden.

      1. morgens ;-)

        Ich halte diese Zeilen für problematisch, weil zu kurz:

        [...]

        Im Gegenteil, viel zu lang:[1]

        Naja, immerhin scheinen wir an derselben Stelle Anstoß zu nehmen

        open(INFO, $file) or die "Konnte Datei $file nicht oeffnen:$!";
        print while(<INFO>);
        close INFO or die "Konnte Datei $file nicht schliessen:$!";

        Ich mag dir ja gerne zustimmen, daß das Zwischenspeichern in einen Array nicht der "Königsweg" ist. Bei der Lösung, die du hier vorschlägst, sehe ich nicht, wie ich gezielt Veränderungen für einzelne Zeilen anbringen könnte  -  wenn ich beispielsweise unterhalb von Zeile 27 vier weitere Zeilen einfügen will.

        Du läßt @lines ausgeben, ohne das vorher zu splitten.
        Daran kanns nicht liegen.

        Das tat es bei mir einmal in einem vergleichbaren Fall

        Wenn das Script aus dem Original-Posting keinen Text zurückliefert, dann müßte add.html leer sein.

        Völlig richtig

        Grüße aus Berlin

        Christoph S.

        1. Hallo Christoph,

          Bei der Lösung, die du hier vorschlägst, sehe ich nicht, wie ich gezielt Veränderungen für einzelne Zeilen anbringen könnte  -  wenn ich beispielsweise unterhalb von Zeile 27 vier weitere Zeilen einfügen will.

          1.) Ist es denn gefordert, Veränderungen vorzunehmen? Wozu dem Rechnung tragen, wenn es gar nicht notwendig ist?

          2.) Es gibt ja auch die Möglichkeit:
          while(<IN>)
            {
             [mach was ]
            }
          Im Block kann dann jede beliebige Verarbeitung einer Zeile passieren.

          Eine Datei in ein Array einlesen kann zwar durchaus Sinn machen, aber ich denke, daß es wirklich meistens unnötig ist.

          Grüße aus Berlin

          Grüße nach Berlin
            Klaus