Christoph Schnauß: nicht deutbare Fehlermeldungen

hallo Forum,

vor ein paar Tagen hatte ich eine vergleichbare Frage, der Thread dazu ist inzwischen im Archiv verschwunden. Ich stolpere trotzdem gelegentlich über log-Einträge, die ich nicht verstehe. Zwei davon machen mich besonders nervös.

Nummer 1:
"Use of uninitialized value in concatenation (.) or string"  -  übersetzen kann ich mir das, aber die Zeile, für die ich das im Moment regelmäßig finde, sieht so aus:
  $tab_kopf = $cgi->Tr($cgi->td({-width =>'12%', -style =>'border: 1 solid #0C0C0C', -valign =>'top'}, "\n".
Und da sehe ich nichts, was "nicht initialisiert" wäre. Der Punkt, der hintendranhängt, ist wichtig, die "Verkettung" geht noch über ein paar weitere Zeilen wie
  $cgi->a({-href => $basisverz.'/index.htm'},'zum Anfang').$cgi->br.
und ich verstehe nicht, was daran ein "nicht initialisierter Wert" sein könnte.

Nummer 2:
"Use of uninitialized value in join or string at (eval 4) line 16" - damit habe ich noch mehr Schwierigkeiten, weil dieser Angabe keine Zeilennummer folgt und ich einfach nicht weiß, was hier mit "eval 4" gemeint ist. Im Script kommt selbstverständlich absolut kein "eval" vor, Zeile 16 im Script ist ein Kommentar. Ich finde also einfach die Stelle nicht, auf die sich dieser log-Eintrag bezieht.

Hat jemand einen Hinweis, in welche Richtung ich denken sollte?

Grüße aus Berlin

Christoph S.

  1. Moin!

    "Use of uninitialized value in concatenation (.) or string"  -  übersetzen kann ich mir das, aber die Zeile, für die ich das im Moment regelmäßig finde, sieht so aus:
      $tab_kopf = $cgi->Tr($cgi->td({-width =>'12%', -style =>'border: 1 solid #0C0C0C', -valign =>'top'}, "\n".

    Falls es das ist: Schau mal auf das letzte Zeichen. Da ist ein Punkt. Sollte das nicht ein Semikolon sein?

    $cgi->a({-href => $basisverz.'/index.htm'},'zum

    Anfang').$cgi->br.
    Dito.

    und ich verstehe nicht, was daran ein "nicht initialisierter Wert" sein könnte.

    Das "in concatenation (.)" brachte mich drauf. Ich habe einen Punkt gesucht und fast aufgegeben, was ein fastix aber niemals tut :)

    Nummer 2:
    "Use of uninitialized value in join or string at (eval 4) line 16" »» Zeile 16 im Script ist ein Kommentar.
    Hat jemand einen Hinweis, in welche Richtung ich denken sollte?

    Ja. Untersuche die Zeilen vorher auf ähnliches.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Meinereinerselbst ist auf der Suche nach Aufträgen
    1. hallo fastix,

      $tab_kopf = $cgi->Tr($cgi->td({-width =>'12%', -style =>'border: 1 solid #0C0C0C', -valign =>'top'}, "\n".
      Falls es das ist: Schau mal auf das letzte Zeichen. Da ist ein Punkt. Sollte das nicht ein Semikolon sein?

      Nein. Hab ich ja bereits angegeben. Ich könnte sämtliche 12 folgende Zeilen ohne Zeilenumbruch hintendranhängen, bloß ist das dann für mich schwer lesbar. Das Ganze ist ein langer String. Und das Verknüpfungszeichen ist der Punkt, siehe http://selfhtml.teamone.de/cgiperl/sprache/operatoren.htm#zeichenkettenverknuepfung.

      $cgi->a({-href => $basisverz.'/index.htm'},'zum
      Anfang').$cgi->br.
      Dito.

      dito ;-) Es handelt sich um eine Tabellenzeile, die ich in eine Variable packe. Je nach den Bedingungen einer if/else-Abfrage ist der in $tab_kopf gespeicherte Wert der Tabellenzeile aber unterschiedlich, das heißt, es werden in der HTML-Ausgabe unterschiedliche links angezeigt.
      Das Ganze funktioniert auch. Das heißt, ich bekomme am Bildschirm alles angezeigt, was ich sehen möchte. Leider gibt es _zusätzlich_ diesen Eintrag im log, und den wäre ich gerne los.

      "Use of uninitialized value in join or string at (eval 4) line 16"

      »» Zeile 16 im Script ist ein Kommentar.

      Hat jemand einen Hinweis, in welche Richtung ich denken sollte?
      Ja. Untersuche die Zeilen vorher auf ähnliches.

      Vor Zeile 16 gibt es ebenfalls ausschließlich Kommentare und natürlich als allererste Zeile die shebang. Da liegt das Problem aber gewiß nicht.

      "eval 4" bezeichnt irgendeinen Startpunkt, von dem aus ich dann wohl 16 Zeilen weitergehen müßte. Aber genau diesen Startpunkt finde ich nicht.

      Grüße aus Berlin

      Christoph S.

      1. Moin!

        hallo fastix,

        Hallo Christian

        Und das Verknüpfungszeichen ist der Punkt, siehe

        Ja, klar. Die "concatenation (.)".

        $tab_kopf = $cgi->Tr($cgi->td({-width =>'12%', -style =>'border: 1 solid #0C0C0C', -valign =>'top'}, "\n".

        Versuch doch bitte mal die Zeilentrennung etwas "glücklicher".

        $tab_kopf = $cgi->Tr(
                         $cgi->td(
                          {-width =>'12%',
                           -style =>'border: 1 solid #0C0C0C',
                           -valign =>'top'},
                           "\n"
                           ."hier gehts weiter"
             ............................

        Mich würde vor allem interessieren, ob das Problem dann noch auftritt, wenn auf den Punkt "was" folgt.

        Ich hab das bis jetzt auch immer nur so gesehen:

        $str="Eins"
            ." ,Zwei,"
            ." ,Drei";

        Ich bin mir nicht sicher, wie der Interpreter auf:
        $str="Eins".
            " ,Zwei,".
            " ,Drei";
        reagiert.

        Vor Zeile 16 gibt es ebenfalls ausschließlich Kommentare und natürlich als allererste Zeile die shebang. Da liegt das Problem aber gewiß nicht.

        Wenn es denn so ist: Da darf das Problem jedenfalls nicht liegen.

        Kannst Du einen Link posten? Gegebenenfalls lässt sich das womöglich auf bestimmte (unsinnige) Benutzereingaben oder im Fall von GET- auf URL- Manipulationen (respektive "Linkerkennungsskripte") zurückführen. Man kann ja das Skript darauf testen ob es bei bestimmten Fehleingaben "Unsinn" macht und/oder Fehlermeldungen auf den Browser "wirft".
        Das wäre sicher interessant zu wissen, wann der Fehler auftritt.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Meinereinerselbst ist auf der Suche nach Aufträgen
        1. hallo fastix,

          Kannst Du einen Link posten?

          Ja: http://www.christoph-schnauss.de/misc/kurs/forum/script.txt

          Aber: Bitte alles andere in diesem online-Verzeichnis unbeachtet lassen, das stimmt NICHT mit dieser Script-Version überein, und das Script selbst ist auch noch nicht online.

          Das wäre sicher interessant zu wissen, wann der Fehler auftritt.

          Konkret in Zeile 267 des angegebenen Scripts.

          Grüße aus Berlin

          Christoph S.

          1. Moin!

            So. Ich hab das schrittweise zerlegt, viel getestet, einiges über das von mir ungeliebte (wir hatten das Thema mal) Modul CGI gelernt ... und den Fehler hier gefunden:

            $followup_num.','.$num

            Und zwar hab ich eine weitere Variable definiert und den Wert erst dieser zugewiesen und dann diese an der Stelle eingesetzt:

            $fastix_followup = $followup_num.','.$num;

            Ergebnis: Genau diese vorher eingefügte Zeile schmeisst jetzt den Error, solange use strict (Das ist Zeile 16!) gesetzt ist und es sich um einen neues Thema handelt. Der Fehler in der veränderten Zeile ist "weg".

            Könnte dies daran liegen, daß eine der Variablen nicht gesetzt ist, weil bei einem neuen Thema $followup_num nicht gesetzt wird? Dann käme die Fehlermeldung genau hin.

            Ja, ich weiss, das Du $followup_num in Zeile 35 und $num in Zeile 34 als globale Variablen einführst.....

            Noch ein Tip: Du kannst bei der Tabelle "zeilenweise" vorgehen. Das macht die Fehlersuche einfacher: Perl gibt dir immer die Nummer der Zeile an, in welcher ein Befehl beginnt, nicht wo der wirkliche Fehler ist. Dein Befehl ging halt über ein Dutzend Zeilen.

            Die Fehlermeldung für Zeile 16 wird wohl nur zuvor ausgegeben, weil genau bei der Prüfung auf die gesetzten Variablen der Fehler auftritt. Das ist, naja, buggy (in Perl...).
            Ach ja: Es ist kein Fehler, der zum Abbruch des Skriptes führt: Es funktioniert scheinbar normal (Auf Seiten des Benutzers), eher eine Warnung oder Notiz.

            Im Error-log steht auch nichts von:
            Execution of x:\xxxx\script.pl aborted due to compilation errors.

            • was drin stehen würde, wenn Perl abbricht.

            Meine Version:
            G:>perl -version
            This is perl, v5.8.0 built for MSWin32-x86-multi-thread

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix®

            --
            Meinereinerselbst ist auf der Suche nach Aufträgen
            1. hallo fastix,

              So. Ich hab das schrittweise zerlegt, viel getestet, einiges über das von mir ungeliebte (wir hatten das Thema mal) Modul CGI gelernt ...

              Oh. Du hast dich tatsächlich durch das Teil durchgegraben?

              und den Fehler hier gefunden:
              $followup_num.','.$num

              Das ist möglich. Mein "Zähler" hat mir bereits größere Probleme bereitet und gehört sowieso zu den Konstruktionsteilen, an die ich nochmal ran muß.

              Und zwar hab ich eine weitere Variable definiert
              Ergebnis: [...] Der Fehler in der veränderten Zeile ist "weg".

              Das konnte ich nicht nachvollziehen. Es gibt ja noch zwei weitere Variablen ($mail und $url), die fehlen oder "" als Wert haben dürfen, und die werden nicht angemeckert.

              Könnte dies daran liegen, daß eine der Variablen nicht gesetzt ist, weil bei einem neuen Thema $followup_num nicht gesetzt wird?

              Das ist sehr wahrscheinlich, da dann $followup_num noch gar nicht existieren kann; $num existiert immer. Allerdings ist die Variable von mehreren if/else-Abfragen abhängig. Ich habe noch getestet, ob ich in das (statische) aufrufende HTML-Formular ein <input type="hidden"> einbauen sollte -  das hat leider nichts gebracht, in den generierten HTML-Dokumenten ist sowas allerdings drin.

              Ach ja: Es ist kein Fehler, der zum Abbruch des Skriptes führt

              Eben. Deshalb ist es mir auch eher zufällig aufgefallen bei einem Blick in meine Server-logs. Trotzdem ist es ein "Fehler", und den sollte ich ja wohl beseitigen.

              This is perl, v5.8.0 built for MSWin32-x86-multi-thread

              Bei mir ebenfalls  -  und der vorgesehene Server, auf dem das Script mal laufen soll, ist ein Windows-System, daher ist die shebang korrekt.

              Grüße aus Berlin

              Christoph S.

            2. hi,

              Und zwar hab ich eine weitere Variable definiert und den Wert erst dieser zugewiesen und dann diese an der Stelle eingesetzt:
              $fastix_followup = $followup_num.','.$num;
              Ergebnis: [...] Der Fehler in der veränderten Zeile ist "weg".

              Menno, du hättest auch schreiben sollen, _wo_ du diese neue Variable eingefügt hast. Ich habe das Problem inzwischen erledigt, weil ich grade eben plötzlich auf die Idee kam, diese dämliche Variable "$followup_num" nicht mehr global, sondern lokal zu initialisieren innerhalb meiner Subroutine "neue_datei". Prompt sind alle Fehlermeldungen im log verschwunden, und das Script arbeitet völlig konfliktfrei.

              Nachschieben muß ich aber, daß mir der Grund dafür nicht ganz klar ist. Irgendwo fehlts mir wohl noch beim Verständnis der Namensräume bzw. beim Unterschied globaler und lokaler Variablen.

              Grüße aus Berlin

              Christoph S.

              1. Moin!

                Menno, du hättest auch schreiben sollen, _wo_ du diese neue Variable eingefügt hast.

                Jein. Ich hatte den "Fehler" ,ich denke immer noch,  es ist eine "Warnung" (perl -W) nicht komplett vermieden, sondern nur verschoben und auf diesem Weg die Quelle des Problems eingegrenzt.

                Bis in die Tiefen der Definition der Namen habe ich mich an der Stelle gar nicht vorgearbeitet, als mir dann klar wurde woran es lag.

                Wie die Meldung jetzt zustande kam lässt sich erst sagen, wenn ich die komplette "Vita" der Variablen durchchecke, also quasi das ganze Skript vollständig debugge. Dazu fehlen mir freilich ein oder zwei Kleinigkeiten: zum ersten die statische HTML- Seite (Ich kann mir aber fast vorstellen, was drin steht) und zum andern schlicht und einfach Zeit: ich habe tatsächlich augenblicklich und in nächster Zeit ein paar Seminare zu halten: Es wird Herbst und meine Qualitäten erfreuen sich der jahreszeitlich bedingten außerordentlichen Beliebtheit.

                MFFG (Mit freundlich- friedfertigem Grinsen)

                fastix®

                --
                Meinereinerselbst ist auf der Suche nach Aufträgen
                1. hallo fastix,

                  Ich hatte den "Fehler" ,ich denke immer noch,  es ist eine "Warnung" (perl -W) nicht komplett vermieden, sondern nur verschoben

                  Richtig, es ist offenbar "nur" eine Warnung (auch wenn im log "error" steht). Wenn ich den Schalter -w weglasse, kommt die Meldung nicht mehr.

                  Wie die Meldung jetzt zustande kam lässt sich erst sagen, wenn ich die komplette "Vita" der Variablen durchchecke, also quasi das ganze Skript vollständig debugge. Dazu fehlen mir freilich ein oder zwei Kleinigkeiten: zum ersten die statische HTML- Seite (Ich kann mir aber fast vorstellen, was drin steht) und zum andern schlicht und einfach Zeit

                  Naja, ein _bißchen_ Arbeit darf mir schon auch noch übrigbleiben, und bisher bist du bei mir ja nicht angestellt ;-)

                  ich habe tatsächlich augenblicklich und in nächster Zeit ein paar Seminare zu halten: Es wird Herbst und meine Qualitäten erfreuen sich der jahreszeitlich bedingten außerordentlichen Beliebtheit.

                  Es gibt im Moment tatsächlich einige Angebote (Firmenseminare mit 700 Euro pro Tag Bezahlung), aber ich kriege sie immer erst eine oder zwei Stunden zu spät, oder der Seminarort ist München, oder die Firmen wollen speziellen IT-Sicherheitskram wissen :-(

                  Ich habe im übrigen mein Problem auch im usenet diskutiert, wo prompt Struppi draufgestoßen ist.

                  Grüße aus Berlin

                  Christoph S.

  2. Moin!

    $tab_kopf = $cgi->Tr($cgi->td({-width =>'12%', -style =>'border: 1 solid #0C0C0C', -valign =>'top'}, "\n".

    Außer der Sache mit dem Punkt am Ende:
    Ich zähle zwei runde öffnende Klammern, finde aber keine schließende. Ist Dir da irgendwie ein Zeilenumbruch reingeraten?

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Meinereinerselbst ist auf der Suche nach Aufträgen
    1. hi,

      Außer der Sache mit dem Punkt am Ende:

      Die ich eben beantwortet habe

      Ich zähle zwei runde öffnende Klammern, finde aber keine schließende. Ist Dir da irgendwie ein Zeilenumbruch reingeraten?

      Nein, ich habe bloß die Zeile, in der die schließende runde Klammer steht, nicht mitgepostet. Keine Sorge, das ist es nicht, da würde ich auch noch mehr Fehlermeldungen bekommen und mein Script würde gar nicht ausgeführt. Es wird aber ausgeführt, es arbeitet so, wie ich möchte, bloß im (Server-)log gibt es eine  einzige Zeile mit diesem dämlichen Hinweis.

      Grüße aus Berlin

      Christoph S.