Fehler in Script, komische Fehlermeldung
Stephan
- cgi
0 Cheatah0 Stephan0 Alexander Foken0 Stephan0 Cheatah0 Stephan
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>
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
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
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 :-(
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
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
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
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
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
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
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
Hallo,
ein Leerzeichen hinter ??? ?
Stephan
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
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>
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
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
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. :-(
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
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...
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*
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 :-(
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>
EOM
exit;
}
EOF
aber geht trotzdem nicht :-(
EOF
Stephan, nimm das mal weg.
Gruß Sabine
Vielen, vielen Dank!
Jetzt sagt er zwar keinen Fehler mehr, gibt ir aber einen komischen Error 500 bei dem Script...
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>
Ich weiß nicht, was Du gemacht hast. Du könntest in der error.log des Webservers mal nachsehen.
Gruß Sabine
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...
Bei mir geht es nicht...
Hmm, woran könnte es liegen?
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
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?
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
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
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?
Hallo Stephan,
den schliessenden EOM-Tag vor der Zeile 49 oder?
Nein, vor dem Dateiende (EOF).
Grüße
Andreas
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>
EOM
exit;
}
(EOF)
Ich bin am Verzweifeln!