Stephan: Fehler in Script, komische Fehlermeldung

Hallo,

ich habe folgendes Script:

-----

#!/usr/bin/perl -w
use diagnostics;
################
$db = '/home/www/web1027/html/service-partner/outbound-clicks.db';
$useflock='yes';
$flocklock='2';
$flockunlock='8';

####################

$url=$ENV{'QUERY_STRING'};

####      Form Variables     ####

if ($url)
{
   open(DATA,"$db");
   @lines=<DATA>;
   close(DATA);
   open(DATA,">$db");
   if ($useflock eq 'yes'){flock DATA, $flocklock;}
   foreach $line (@lines)
   {
      ($URL, $count) = split(/|/,$line);
      if ($URL eq $url)
      {
         $count++;
         print DATA ("$URL|$count\n");$old="yes";
      }
      else
      {
         print DATA $line;
      }
   }
   if ($useflock eq 'yes'){flock DATA, $flockunlock;}
   unless ($old)
   {
      print DATA "$url|1\n";
   }
   close(DATA);
   print "Location: $url\n\n";
   exit;
}
else
{
   print "Content-type: text/html\n\n";
   print <<EOM;
<center>

Nowhere To Redirect To!! <a href="http://www.billig-urlauber.de">Back To Billig-Urlauber.de</a>
EOM

exit;
}

-----

und er sagt im Debugger das:

-----

Can't find string terminator "EOM" anywhere before EOF at
 /home/www/web1027/html/service-partner/redirect.cgi line 49 (#1)
    (F) Perl strings can stretch over multiple lines.  This message means
    that the closing delimiter was omitted.  Because bracketed quotes count
    nesting levels, the following is missing its final parenthesis:

print q(The character '(' starts a side comment.);

If you're getting this error from a here-document, you may have included
    unseen whitespace before or after your closing tag. A good programmer's
    editor will have a way to help you find these characters.

Uncaught exception from user code:
 Can't find string terminator "EOM" anywhere before EOF at /home/www/web1027/html/service-partner/redirect.cgi line 49.

-----

Ich fange erst mit CGI an und habe keine Ahnung...

Danke schonmal

Stephan

  1. Hi,

    EOM

    Can't find string terminator "EOM" anywhere before EOF at

    naja, Du hast ja auch keine vollständige Zeile, die nur aus "EOM" besteht.

    Ich fange erst mit CGI an und habe keine Ahnung...

    Dein Problem hat mit CGI aber auch nicht das geringste zu tun. Es ist ein Perl-Problem. Des weiteren lies bitte

    perldoc perlrun (-w)
    perldoc strict
    perldoc CGI
    perldoc -f my
    perldoc -f die

    und diverse Threads im Archiv.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      danke für die Antwort, aber mit einer vollständigen Zeile gehts auch nicht, ich versuche jetzt schon seit 2 Tagen und bin am Verzweifeln :-(

      1. Moin Moin !

        danke für die Antwort, aber mit einer vollständigen Zeile gehts auch nicht, ich versuche jetzt schon seit 2 Tagen und bin am Verzweifeln :-(

        Sorry, aber hier ist ein böser Spruch angebracht: "DENKEN HILFT!"

        Perl sagt Dir, wonach es sucht und wo der Fehler auftritt. Offensichtlich hast Du den Code (der ebenso offensichtlich nicht aus Deinem Kopf stammt) verändert, ohne zu wissen, was Du tust. Das ist im Web-Bereich grundsätzlich gefährlich.

        Nimm Dir die Perl-Dokumentation und suche diese Fehlermeldung. Es gibt eine eigene Dokumentation ausschließlich für Fehlermeldungen, sie heißt perldiag (u.a. auch online unter http://www.perldoc.com/perl5.8.0/pod/perldiag.html zu finden). Dort findest Du die Ursache Deines Problems genauer erläutert.

        Und wenn Du schon in der Perl-Doku liest: Lies weiter, und lerne zu verstehen, was das Stückchen Perl-Code macht, an dem Du rumfummelst.

        Alexander

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        1. Hallo,

          nein, in der Doku ist zu dem nichts beschrieben, jedenfalls findet man mit str+f nix zu EOM...

          Woran liegt es?

          Danke schonmal

          Stephan

          1. Hi,

            nein, in der Doku ist zu dem nichts beschrieben, jedenfalls findet man mit str+f nix zu EOM...

            weder ist Strg+F die richtige Methodik der Suche[1], noch ist "EOM" ein zu erwartender Suchbegriff. Genauso gut hätte die Ende-Markierung des Here-Dokuments "SCHNASSELDIHUH" lauten können.

            [1] Was die Frage aufweist, _wo_ Du eigentlich gesucht hast. In der Perl-Doku offenbar nicht.

            Cheatah

            --
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hallo,

              jetzt habe ich was, das hilft aber auch nicht:

              -----

              Can't find string terminator %s anywhere before EOF
              (F) Perl strings can stretch over multiple lines. This message means that the closing delimiter was omitted. Because bracketed quotes count nesting levels, the following is missing its final parenthesis:

              print q(The character '(' starts a side comment.);

              If you're getting this error from a here-document, you may have included unseen whitespace before or after your closing tag. A good programmer's editor will have a way to help you find these characters.

              -----

              Habt ihr eine Ahnung (oder könnt ihr "A good programmer's editor" spielen ;-) ) ?

              Danke schonmal

              Stephan

              1. Moin Moin !

                Hallo,

                jetzt habe ich was, das hilft aber auch nicht:

                Wenn es Dir nicht hilft, zusammen mit der ursprünglichen Fehlermeldung, dann attestiere ich Dir hiermit fortgeschrittene Denkverweigerung.

                Can't find string terminator %s anywhere before EOF
                (F) Perl strings can stretch over multiple lines. This message means that the closing delimiter was omitted. Because bracketed quotes count nesting levels, the following is missing its final parenthesis:

                print q(The character '(' starts a side comment.);

                If you're getting this error from a here-document, you may have included unseen whitespace before or after your closing tag. A good programmer's editor will have a way to help you find these characters.

                Hier werden dir einige mögliche Ursachen genannt. Eine davon sollte an der Stelle im Code auftauchen, die Perl in der Fehlermeldung bemängelt hat.

                Denk selber, das nehme ich Dir nicht ab. DENKEN TUT NICHT WEH! Denken verweigern schon, wie Du sehr bald festellen wirst, auf die eine oder andere Art.

                Alexander

                --
                Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
                Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                1. Hallo,

                  Can't find string terminator %s anywhere before EOF
                  (F) Perl strings can stretch over multiple lines. This message means that the closing delimiter was omitted. Because bracketed quotes count nesting levels, the following is missing its final parenthesis:

                  print q(The character '(' starts a side comment.);

                  If you're getting this error from a here-document, you may have included unseen whitespace before or after your closing tag. A good programmer's editor will have a way to help you find these characters.

                  Er sagt das:

                  ---

                  """ "kann nicht Zeichenkette-Abschlußwiderstand %s nirgends finden, bevor EOF"" "" (f) Perl-Zeichenketten mehrfache übermäßiglinien ausdehnen können.  Diese Anzeige bedeutet, daß die schließende Begrenzung ausgelassen wurde.  Weil eingeklammerte Anführungsstriche Verschachtelungsniveaus zählen, vermißt das folgende seine abschließenden Klammern:  """ """ "" Druckq(Thebuchstabe ' (' Anfänge eine seitliche Anmerkung.);  """ """ "", wenn Sie diese Störung von einem Hierdokument erhalten, können Sie unseen whitespace vor oder nach Ihrem schließenden Umbau umfaßt haben.  Der Herausgeber eines guten Programmierers hat eine Weise, Ihnen zu helfen, diese Buchstaben zu finden.

                  ---(Google)

                  Ich kapier es nicht, wenn mir jemand das mal in verständlichem Deutsch erklären würde, könnte ich es ja vielleicht verstehen, aus diesem Text verstehe ich jedenfalls nix, bius auf, dass irgendeine Klammer fehlt, es sind aber doch alle zu!

                  Grüße

                  Stephan

                  1. Moin Moin !

                    Ich kapier es nicht, wenn mir jemand das mal in verständlichem Deutsch erklären würde, könnte ich es ja vielleicht verstehen, aus diesem Text verstehe ich jedenfalls nix, bius auf, dass irgendeine Klammer fehlt, es sind aber doch alle zu!

                    Lies genauer, fehlende Klammern sind nur eine Möglichkeit. Und laß die Finger von maschinellen Übersetzungen, da kannst Du genauso gut einfach ein paar Steine aus einem Scabble-Spiel ziehen.

                    Alexander

                    --
                    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
                    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                    1. Hallo,

                      ein Leerzeichen hinter ??? ?

                      Stephan

                      1. Moin Moin !

                        ein Leerzeichen hinter ??? ?

                        Nicht raten, denken! Lies die Fehlermeldung und ihre Erklärung. Übersetze beide notfalls mit dem guten alten Langenscheid-Schülerlexikon Deutsch-Englisch Wort für Wort.

                        Alexander

                        --
                        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
                        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                        1. Hallo,

                          also versuchen wir es mal:

                          Kann den schliessenden Tag für EOM nicht vor EOF finden.
                          Perl Zeichenketten können sich über mehrere Linien ausdehnen.
                          Diese Nachricht heisst, dass der schliessende Tag ausgelassen wurde.
                          Weil eingeklammerte Aführungstriche Verschachtelungsniveaus zählen, vermisst das folgende seine abschliessenden Klammern:
                          Wenn Du diese Nachricht angezueigt bekommst, könntest Du ein Leerzeichen vor oder nach dem schliessenden Tag eingefügt haben.

                          Richtig? Damit kann ich aber immer noch nix anfangen, welches Leerzeichen?

                          Das bezieht sich auf diesen Ausschnitt

                          -----

                          else
                          {
                             print "Content-type: text/html\n\n";
                             print <<EOM;
                          <center>

                          Nowhere To Redirect To!! <a href="http://www.billig-urlauber.de">Back To Billig-Urlauber.de</a>
                          EOM

                          exit;
                          }

                          ----

                          und diese Zeile:

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

                          Die Klammer schliesst sich ja am Ende oder muss ich print <<EOM vor dem Contant-type einfügen?

                          Danke schonmal

                          Stephan

                          1. Moin Moin !

                            Übersetze die *GESAMTE* Erklärung für den Fehler, nicht nur den ersten Absatz. Früher oder später wirst Du über einen Fachbegriff stolpern, dessen Übersetzung keinen Sinn zu machen scheint. Das ist dann der Punkt, an dem Du diesen Fachbegriff recherchieren mußt (die Perldoc-Seite ist da recht hilfreich). Und dann wirst Du den Fehler finden und beseitigen können.

                            Alexander

                            --
                            Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
                            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                            1. Hallo,

                              dann gibt es ja nurnoch

                              Uncaught exception from user code:
                               Can't find string terminator "EOM" anywhere before EOF at /home/www/web1027/html/service-partner/redirect.cgi line 49.

                              und das heisst

                              ?Uncaught? Ausdruck des User-Codes:

                              Nach Uncaught suchen? OK. Dann habe ich nix. :-(

                              1. Moin Moin !

                                Hallo,

                                dann gibt es ja nurnoch

                                Falsch.

                                Uncaught exception from user code:
                                 Can't find string terminator "EOM" anywhere before EOF at /home/www/web1027/html/service-partner/redirect.cgi line 49.

                                und das heisst

                                ?Uncaught? Ausdruck des User-Codes:

                                Nicht "gefangene" Ausnahme ... -- ist hier völlig irrelevant.

                                Nach Uncaught suchen? OK. Dann habe ich nix. :-(

                                Nein.

                                Übersetzte die Erklärung, nicht die Fehlermeldung.

                                Und am Rande: Lies mal bis zu Ende, statt so schnell wie möglich abzubrechen. Das kann Dir viel Arbeit sparen, nicht nur bei meinen Postings und der Fehlererklärung, sondern auch "im richtigen Leben".

                                Alexander

                                --
                                Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
                                Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                                1. Hallo,

                                  jetzt verstehe ich gar nichts meht, es gibt doch nur das

                                  Can't find string terminator %s anywhere before EOF
                                  (F) Perl strings can stretch over multiple lines. This message means that the closing delimiter was omitted. Because bracketed quotes count nesting levels, the following is missing its final parenthesis:

                                  print q(The character '(' starts a side comment.);

                                  If you're getting this error from a here-document, you may have included unseen whitespace before or after your closing tag. A good programmer's editor will have a way to help you find these characters.

                                  und das habe ich alles übersetzt...

                                  1. Hallo Stephan,

                                    If you're getting this error from a here-document, you may have included unseen whitespace before or after your closing tag.

                                    Such mal nach dem richtigen Syntax für ein "here-document"

                                    Gruß Sabine
                                    *hoffentlich hab ich jetzt nicht zu viel verraten*

                                    1. Hallo Sabine,

                                      danke erstmal. So der wäre statt << ja <<"". Danke! Jetzt geht das. Nur jetzt gibt er mir wieder was anderes aus :-( ´

                                      Das '<<' leitet ein Here-Document ein, dessen Inhalt an das vorher
                                      genannte Programm übergeben wird. Um das Ende des Here-Document zu
                                      markieren, gibt man unmittelbar nach dem '<<' eine Zeichenfolge an, die
                                      das Ende markieren soll.
                                      Sinnvollerweise wird oft EOF (End of File) verwendet, aber man kann jede
                                      Zeichenkette benutzen, die im Here-Document nicht vorkommt.

                                      Also doch so oder?

                                      else
                                      {
                                         print "Content-type: text/html\n\n";
                                         print <<EOF
                                      <center>
                                      <a href="http://www.billig-urlauber.de">Back To Billig-Urlauber.de</a>

                                      exit;
                                      }
                                      EOF

                                      Geht aber nicht, gleicher Fehler :-(

                                      1. OK, so:

                                        #!/usr/bin/perl
                                        use diagnostics;
                                        ################
                                        $db = '/home/www/web1027/html/service-partner/outbound-clicks.db';
                                        $useflock='yes';
                                        $flocklock='2';
                                        $flockunlock='8';

                                        ####################

                                        $url=$ENV{'QUERY_STRING'};

                                        ####      Form Variables     ####

                                        if ($url)
                                        {
                                           open(DATA,"$db");
                                           @lines=<DATA>;
                                           close(DATA);
                                           open(DATA,">$db");
                                           if ($useflock eq 'yes'){flock DATA, $flocklock;}
                                           foreach $line (@lines)
                                           {
                                              ($URL, $count) = split(/|/,$line);
                                              if ($URL eq $url)
                                              {
                                                 $count++;
                                                 print DATA ("$URL|$count\n");$old="yes";
                                              }
                                              else
                                              {
                                                 print DATA $line;
                                              }
                                           }
                                           if ($useflock eq 'yes'){flock DATA, $flockunlock;}
                                           unless ($old)
                                           {
                                              print DATA "$url|1\n";
                                           }
                                           close(DATA);
                                           print "Location: $url\n\n";
                                           exit;
                                        }
                                        else
                                        {
                                           print "Content-type: text/html\n\n";
                                           print <<EOM;
                                        <center>

                                        Nowhere To Redirect To!! <a href="http://www.billig-urlauber.de">Back To Billig-Urlauber.de</a>

                                        EOM

                                        exit;
                                        }
                                        EOF

                                        aber geht trotzdem nicht :-(

                                        1. EOF

                                          Stephan, nimm das mal weg.
                                          Gruß Sabine

                                          1. Vielen, vielen Dank!

                                            1. Jetzt sagt er zwar keinen Fehler mehr, gibt ir aber einen komischen Error 500 bei dem Script...

                                              1. Jetzt sagt er zwar keinen Fehler mehr, gibt ir aber einen komischen Error 500 bei dem Script...

                                                Wenn ich das Script im Browser aufrufe, kommt das an (Quellcode):

                                                <center>

                                                Nowhere To Redirect To!! <a href="http://www.billig-urlauber.de">Back To Billig-Urlauber.de</a>

                                                Ich weiß nicht, was Du gemacht hast. Du könntest in der error.log des Webservers mal nachsehen.

                                                Gruß Sabine

                                                1. Bei mir kommt der Error 500, kommt bei Dir wirklich dieser Link, cool, dann müsste es ja gehen! Kann es sein, dass bei mir cgi in dem Verzeichnis nicht aktiviert ist?

                                                  Die Error.Log gibt es bei mir leider nicht...

                                                  1. Bei mir geht es nicht...

                                                    1. Hmm, woran könnte es liegen?

                                                      1. Hallo Stephan,

                                                        Hmm, woran könnte es liegen?

                                                        Das von dir beschriebene Problem kenne ich aus der Situation heraus, dass ich meine Perlscripte unter Windows schreibe, auf dem Server, auf dem sich mein Webspace befindet, allerdings Unix als Betriebssystem läuft.

                                                        Wie du hier http://aktuell.de.selfhtml.org/artikel/cgiperl/zeilenumbruch/index.htm#newline nachlesen kannst, wird Newline in Windows anders dargestellt als unter Unix. Das führte bei meinen HERE-Dokumenten zu dem von dir beschriebenen Fehler. Abhilfe schuf, in Proton das Zeilenumbruchformat auf "Unix" zu stellen.

                                                        Btw, mittlerweile nutze ich für größere HTML-Ausgaben das Modul HTML::Template.

                                                        Vielleicht hilft's
                                                        Torsten

                                                        1. Hallo,

                                                          leider hilft das nicht, ich habe es online erstellt, dann sollte es normalerweise gehen...

                                                          Woran noch?

                                                          Danke schonmal

                                                          Stephan

                                                          PS: Kann man dieses Prog nicht auch irgendwie in PHP schreiben?

                                                          1. Hallo Stephan,

                                                            leider hilft das nicht, ich habe es online erstellt, dann sollte es normalerweise gehen ... Woran noch?

                                                            Hm, leider keine weitere Idee als das HERE-Dokument einfach wegzulassen, so umfangreich ist der HTML-Code ja nicht. Alternativ dazu könntest du auch den q- oder qq-Operator nutzen:

                                                            http://selfhtml.teamone.de/cgiperl/sprache/zeichenketten.htm#regeln

                                                            PS: Kann man dieses Prog nicht auch irgendwie in PHP schreiben?

                                                            Ist die Frage allen Ernstes an mich gerichtet?
                                                            ;-))

                                                            Grüße
                                                            Torsten

                              2. Hallo Stephan,

                                Can't find string terminator "EOM" anywhere before EOF at /home/www/web1027/html/service-partner/redirect.cgi line 49.

                                Noch deutlicher kann dir nicht gesagt werden, was fehlt.

                                Grüße
                                Andreas

                                --
                                "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
                                (Rich Cook)
                                1. Hallo,

                                  den schliessenden EOM-Tag vor der Zeile 49 oder?

                                  Aber dann müsste ich ihn ja schliessen, bevor er in zeile 49 überhaupt geöffnet wurde, oder darf dieser Tag nicht über 2 Zeilen gehen?

                                  1. Hallo Stephan,

                                    den schliessenden EOM-Tag vor der Zeile 49 oder?

                                    Nein, vor dem Dateiende (EOF).

                                    Grüße
                                    Andreas

                                    --
                                    "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
                                    (Rich Cook)
                                    1. Hallo,

                                      es geht nicht, jetzt ist zwar der Syntax OK, der Rest aber nicht mehr:

                                      Useless use of a constant in void context at
                                       /home/www/web1027/html/service-partner/billig-urlauber/redirect.cgi line 56 (#1)
                                          (W void) You did something without a side effect in a context that does
                                          nothing with the return value, such as a statement that doesn't return a
                                          value from a block, or the left side of a scalar comma operator.  Very
                                          often this points not to stupidity on your part, but a failure of Perl
                                          to parse your program the way you thought it would.  For example, you'd
                                          get this if you mixed up your C precedence with Python precedence and
                                          said

                                      $one, $two = 1, 2;

                                      when you meant to say

                                      ($one, $two) = (1, 2);

                                      Another common error is to use ordinary parentheses to construct a list
                                          reference when you should be using square or curly brackets, for
                                          example, if you say

                                      $array = (1,2);

                                      when you should have said

                                      $array = [1,2];

                                      The square brackets explicitly turn a list value into a scalar value,
                                          while parentheses do not.  So when a parenthesized list is evaluated in
                                          a scalar context, the comma is treated like C's comma operator, which
                                          throws away the left argument, which is not what you want.  See
                                          perlref for more on this.

                                      /home/www/web1027/html/service-partner/billig-urlauber/redirect.cgi syntax OK

                                      und der Code

                                      #!/usr/bin/perl
                                      use diagnostics;
                                      ################
                                      $db = '/home/www/web1027/html/service-partner/outbound-clicks.db';
                                      $useflock='yes';
                                      $flocklock='2';
                                      $flockunlock='8';

                                      ####################

                                      $url=$ENV{'QUERY_STRING'};

                                      ####      Form Variables     ####

                                      if ($url)
                                      {
                                         open(DATA,"$db");
                                         @lines=<DATA>;
                                         close(DATA);
                                         open(DATA,">$db");
                                         if ($useflock eq 'yes'){flock DATA, $flocklock;}
                                         foreach $line (@lines)
                                         {
                                            ($URL, $count) = split(/|/,$line);
                                            if ($URL eq $url)
                                            {
                                               $count++;
                                               print DATA ("$URL|$count\n");$old="yes";
                                            }
                                            else
                                            {
                                               print DATA $line;
                                            }
                                         }
                                         if ($useflock eq 'yes'){flock DATA, $flockunlock;}
                                         unless ($old)
                                         {
                                            print DATA "$url|1\n";
                                         }
                                         close(DATA);
                                         print "Location: $url\n\n";
                                         exit;
                                      }
                                      else
                                      {
                                         print "Content-type: text/html\n\n";
                                         print <<EOM;
                                      <center>

                                      Nowhere To Redirect To!! <a href="http://www.billig-urlauber.de">Back To Billig-Urlauber.de</a>

                                      EOM

                                      exit;
                                      }
                                      (EOF)

                                      Ich bin am Verzweifeln!