Modul macht nix offline?!
Johnny
- perl
Hallo,
ich habe jetzt mein Script so umgebaut, daß die meisten Subroutinen als Module ausgelagert sind und beim Start geladen werden. Es funktioniert auch alles...
...bis auf das Versenden der Mails und die HTML-Ausgabe. Dabei funktioniert das nicht grundsätzlich nicht, sondern nur im Debug-Modus offline. Wenn ich alles hochlade, geht es wieder. Doch damit dauert das Geteste natürlich erheblich länger...
Mir scheint, als würde das Modul die Ausgabe (mail oder html) zwar schreiben, aber irgendwo anders hin - denn online stimmt es. <rätsel>
Hat da jemand einen Tipp für mich?!
Muchas Gracias
JOhnnY
Halihallo Johnny
...bis auf das Versenden der Mails und die HTML-Ausgabe. Dabei funktioniert das nicht grundsätzlich nicht, sondern nur im Debug-Modus offline. Wenn ich alles hochlade, geht es wieder. Doch damit dauert das Geteste natürlich erheblich länger...
Was meinst du mit Debug-Modus?
Mir scheint, als würde das Modul die Ausgabe (mail oder html) zwar schreiben, aber irgendwo anders hin - denn online stimmt es. <rätsel>
Won welche(m|n) Modul(en) sprichst du? - Gib uns mal ein Codebeispiel von einem Script und dem Modul, welches du programmiert hast.
Viele Grüsse
Philipp
Halihallo Johnny
Was meinst du mit Debug-Modus?
--- mein Mail verschickt u.a. Mails und läuft auf dem Server. Damit ich mir das Hochladen spare, habe ich einen Debug-Modus eingerichtet, der die Ausgabe auf den Monitor leitet und das Script auf meinem PC (lokaler Webserver, sozusagen) ausführt.
Won welche(m|n) Modul(en) sprichst du? - Gib uns mal ein Codebeispiel von einem Script und dem Modul, welches du programmiert hast.
--- hier ist das Modul namens htmloutput.pm:
Es benutzt ein weiteres Modul namens parse, welches die subroutine parsetext enthält, die Variablen im Text ersetzt - das funktioniert auch.
#!/usr/bin/perl
#!/usr/local/bin/perl
use parse;
sub ausgabe {
$ausgabetext = &parsetext($_[0]);
&html("templates/html_ausgabe.txt");
exit;
}
sub html {
open (html_file, "$_[0]") or &ausgabe("OPEN-Fehler :$_[0]");
flock(html_file, 2);
@html_data = <html_file>;
close (html_file);
print "Content-type: text/html\n\n".&parsetext(join("",@html_data));
}
1;
Der Aufruf aus dem Hauptscript erfolgt dann wie folgt:
#!/usr/bin/perl
#!/usr/local/bin/perl
use parse;
use htmloutput;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
.
.
.
&ausgabe($time_diff);
Damit sollte eine HTML-Ausgabe der Variable $time_diff erfolgen. Das passiert aber nicht. Das Script stürzt nicht ab. Nur die HTML-Ausgabe passiert nicht.
Für die abschließende "1;" habe ich in Self-HTML keine Erklärung gefunden. Kannst du mich da vielleicht auch noch aufklären?! ;-)
Grazie!
JohnnY
Halihallo Johnny
Was meinst du mit Debug-Modus?
--- mein Mail verschickt u.a. Mails und läuft auf dem Server.^
^^^^^^^^^^^^^^^^^^^^^^^^^^
"das glaube ich nicht, Tim/Johnny" :-)
Damit ich mir das Hochladen spare, habe ich einen Debug-Modus eingerichtet, der die Ausgabe auf den Monitor leitet und das Script auf meinem PC (lokaler Webserver, sozusagen) ausführt.
Das versteh ich nicht wirklich. Wie willst du durch einen Debug-Modus das Hochladen von was sparen?
#!/usr/bin/perl
#!/usr/local/bin/perl
?? - Na wat den nu?
sub ausgabe {
$ausgabetext = &parsetext($_[0]);
&html("templates/html_ausgabe.txt");
exit;
}sub html {
open (html_file, "$_[0]") or &ausgabe("OPEN-Fehler :$_[0]");
flock(html_file, 2);
@html_data = <html_file>;
close (html_file);
print "Content-type: text/html\n\n".&parsetext(join("",@html_data));
}
Dieses Script _nicht_ nocheinmal starten! - Du erzeugst jedesmal eine Endlosschlaufe! - Du hast vergessen, die Datei templates/html_ausgabe.txt auf den Server zu kopieren, habe ich recht? - Ist zumindest das einzige, was ich mir als Fehler vorstellen könnte.
Damit sollte eine HTML-Ausgabe der Variable $time_diff erfolgen. Das passiert aber nicht. Das Script stürzt nicht ab. Nur die HTML-Ausgabe passiert nicht.
Ja, da das Script gar nie zur Ausgabe kommt und sich immer wieder 'in Schwanz beisst ;)
Für die abschließende "1;" habe ich in Self-HTML keine Erklärung gefunden. Kannst du mich da vielleicht auch noch aufklären?! ;-)
Na, aber gerne Johnny ;)
Jedes Modul _muss_ einen "wahren" Wert zurückgeben. Ein wahrer Wert ist z. B. 1 oder 'just another true value', das Return ist implizit.
Viele Grüsse
Philipp
Hi Philipp
Was meinst du mit Debug-Modus?
--- mein Mail verschickt u.a. Mails und läuft auf dem Server.^
^^^^^^^^^^^^^^^^^^^^^^^^^^"das glaube ich nicht, Tim/Johnny" :-)
--- na doch! Ich hab ein Mail programmiert, welches Mails verschickt. Heiße Sache, was?! <prust>... :))
Das versteh ich nicht wirklich. Wie willst du durch einen Debug-Modus das Hochladen von was sparen?
--- so kann ich das Script offline auf meinem PC testen und muß nicht jedesmal "echte" Mails schicken. Natürlich "spare" ich mir das Hochladen damit nicht, aber solange, bis das Script so läuft, wie ich es mir wünsche, brauche ich nicht online auf meinem Webspace arbeiten, sondern kann mir die Ausgabe offline angucken. So meinte ich... :)
#!/usr/bin/perl
#!/usr/local/bin/perl?? - Na wat den nu?
--- ja, äh, I don´t know. Hab ich irgendwo abgeguckt und übernommen. ...
Dieses Script _nicht_ nocheinmal starten! - Du erzeugst jedesmal eine Endlosschlaufe! - Du hast vergessen, die Datei templates/html_ausgabe.txt auf den Server zu kopieren, habe ich recht? - Ist zumindest das einzige, was ich mir als Fehler vorstellen könnte.
--- die Datei ist da. Der Fehler lag woanders. Ich habe jetzt folgende Zeile hinzugefügt:
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
und damit geht´s...
Ja, da das Script gar nie zur Ausgabe kommt und sich immer wieder 'in Schwanz beisst ;)
--- dann hat es gut zu tun, das stimmt... :)
» Jedes Modul _muss_ einen "wahren" Wert zurückgeben. Ein wahrer Wert ist z. B. 1 oder 'just another true value', das Return ist implizit.
--- ah, ok, danke! Das liebe ich an Perl: da steht da eine herrenlose "1" in der Gegend herum und ist eine vollständige Anweisung - was auch sonst??? Ist echt eine witzige Sprache... ;))
Muchas Gracias,
JOhnnY
Halihallo Johnny
Was meinst du mit Debug-Modus?
--- mein Mail verschickt u.a. Mails und läuft auf dem Server.^
^^^^^^^^^^^^^^^^^^^^^^^^^^"das glaube ich nicht, Tim/Johnny" :-)
--- na doch! Ich hab ein Mail programmiert, welches Mails verschickt. Heiße Sache, was?! <prust>... :))
Soweit ist das gar nicht hergeholt. Microsoft hat das ja implementiert, dass man aus Mails selber wieder Mails versenden kann. Aber M$ war die einzige, die das zu schätzen verstand. Alle anderen nannten dieses Feature eine Sicherheitslücke *g*
?? - Na wat den nu?
--- ja, äh, I don´t know. Hab ich irgendwo abgeguckt und übernommen. ...
Pfui! ;)
Na, na, einfach das stehen lassen, wo man auch deinen Perlinterpreter finden kann.
Dieses Script _nicht_ nocheinmal starten! - Du erzeugst jedesmal eine Endlosschlaufe! - Du hast vergessen, die Datei templates/html_ausgabe.txt auf den Server zu kopieren, habe ich recht? - Ist zumindest das einzige, was ich mir als Fehler vorstellen könnte.
--- die Datei ist da. Der Fehler lag woanders. Ich habe jetzt folgende Zeile hinzugefügt:
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
und damit geht´s...
Das ist mir absolut unverständlich (kann mir nicht ausmahlen, warum dies die Funktionalität des Scritps einschränkt). Was macht denn diese Parsetext - Funktion, die du uns vorenthielst?
Ja, da das Script gar nie zur Ausgabe kommt und sich immer wieder 'in Schwanz beisst ;)
--- dann hat es gut zu tun, das stimmt... :)
Naja, meine Folgerung, dass die Datei ... nicht hochgeladen sei, war zwar falsch. Aber das (mögliche) Problem und somit eine Absturzgefahr im Source bleibt. Schau mal, was du machst:
du startest &ausgabe, welche html aufruft. In html, falls das Template nicht gefunden wird, wird wieder &ausgabe aufgerufen... Das gibt dir, wenn das Template nicht gefunden wird _immer_ eine Endlosschleife. An deiner Stelle würde ich es gar nie soweit kommen lassen und dem open in html einen "die" (Fehler) verpassen, welcher dann natürlich durch CGI::Carp abgefangen wird, oder eine andere Funktion, welche den Fehler ausgibt, nur eben nicht die html oder ausgabe Funktion, welche intern wieder auf html verweist!
» Jedes Modul _muss_ einen "wahren" Wert zurückgeben. Ein wahrer Wert ist z. B. 1 oder 'just another true value', das Return ist implizit.
--- ah, ok, danke! Das liebe ich an Perl: da steht da eine herrenlose "1" in der Gegend herum und ist eine vollständige Anweisung - was auch sonst??? Ist echt eine witzige Sprache... ;))
Für viele verwirrend, für andere die Liebe zu Perl :-)
Viele Grüsse
Philipp
Moin Moin !
#!/usr/bin/perl
^-- das ist im Modul über. Dafür fehlt ein >> package SomeName; <<
#!/usr/local/bin/perl
^-- das auch.
^-- hier fehlt >> use strict; <<
use parse;
^-- Modulnamen ausschließlich in Kleinbuchstaben sind für Perl reserviert, Modulnamen ausschließlich in Großbuchstaben ebenso.
sub ausgabe {
$ausgabetext = &parsetext($_[0]);
&html("templates/html_ausgabe.txt");
exit;
}sub html {
open (html_file, "$_[0]") or &ausgabe("OPEN-Fehler :$_[0]");
flock(html_file, 2);
@html_data = <html_file>;
close (html_file);
print "Content-type: text/html\n\n".&parsetext(join("",@html_data));
}1;
Der Aufruf aus dem Hauptscript erfolgt dann wie folgt:
#!/usr/bin/perl
^-- hier fehlt ein >> -w <<
#!/usr/local/bin/perl
^-- das ist über, dafür fehlt >> use strict; <<
use parse;
use htmloutput;
^-- Modulnamen ausschließlich in Kleinbuchstaben sind reserviert.
[...]
use CGI::Carp qw(fatalsToBrowser);
^-- das sollte so früh wie möglich geladen werden.
&ausgabe($time_diff);
^-- das ist Perl4-Notation, bitte das >> & << weglassen.
Nimm Dir vielleicht mal die Perl-Doku vor, Du machst sehr viele Anfängerfehler, die Dir das Leben wirklich schwer machen können.
Alexander
Hi Alexander,
#!/usr/bin/perl
^-- das ist im Modul über. Dafür fehlt ein >> package SomeName; <<
--- damit kann ich aber keine Variablen mehr zwischen den Modulen hin- und herreichen, oder?
#!/usr/bin/perl
^-- hier fehlt ein >> -w <<
--- hhhmmmm, wenn ich das einsetze, dann sagt er mir "Diese Seite kann nicht angezeigt werden." - was halte ich denn davon?!
#!/usr/local/bin/perl
^-- das ist über, dafür fehlt >> use strict; <<
--- das werde ich mal umbauen...
Nimm Dir vielleicht mal die Perl-Doku vor, Du machst sehr viele Anfängerfehler, die Dir das Leben wirklich schwer machen können.
--- ich bin schrecklich dilletantisch, was das Lernen angeht. Try and Error. Und manchmal heißt es dann aber doch: Back to Basics und wieder was an den Grundlagen tun. So wie z.B. jetzt... <zähneknisch> ;-)
Danke Dir!
JOhnnY
Halihallo Johnny
#!/usr/bin/perl
^-- das ist im Modul über. Dafür fehlt ein >> package SomeName; <<
--- damit kann ich aber keine Variablen mehr zwischen den Modulen hin- und herreichen, oder?
Doch, aber du musst dann Exporter verwenden bzw. die Variablen etwas anders ansprechen. z. B.
Modul parse, Variable $test
$parse::test
^-- hier fehlt ein >> -w <<
--- hhhmmmm, wenn ich das einsetze, dann sagt er mir "Diese Seite kann nicht angezeigt werden." - was halte ich denn davon?!
Was du davon hälst, weiss ich nicht, aber ich halte davon, dass dein Script also noch "Unschönheiten" enthält und eben durch den -w Schalter, welche diese Ausfindig macht, zum Absturz führen. Wenn du das Script offline mit -w testest (in der Schell, nicht übern Webserver), dann siehst du die Fehlermeldungen (im Webserver siehst du diese im log, evtl.). Übern Webserver erhälst du einen Fehler, da der Perlinterpreter zuerst einige Warnungen ausgibt und erst dann den richtigen Header, das stört den Webserver und gibt den Fehler aus. Unterbinden könntest du dies (evtl.), indem du den Header in BEGIN ausgibst:
BEGIN {
print 'Content-Type: text/html'."\015\012" x 2;
}
Befehle in BEGIN werden ganz am Anfang, also noch _vor_ der ersten Anweisung (die sich nicht in BEGIN befindet) im Script ausgeführt.
#!/usr/local/bin/perl
^-- das ist über, dafür fehlt >> use strict; <<
--- das werde ich mal umbauen...
Das würde ich dir in der Tat empfehlen. Damit verminderst du dir _einige_ Probleme, auch wenn's im Moment nicht so aussieht. Zuerst regen dich vielleicht die Fehlermeldungen auf, aber bald wirst du diese zu verhindern wissen und dann ist das use strict _sehr_ _sehr_ sinnvoll, wie auch use warnings (-w Schalter).
Nimm Dir vielleicht mal die Perl-Doku vor, Du machst sehr viele Anfängerfehler, die Dir das Leben wirklich schwer machen können.
--- ich bin schrecklich dilletantisch, was das Lernen angeht. Try and Error. Und manchmal heißt es dann aber doch: Back to Basics und wieder was an den Grundlagen tun. So wie z.B. jetzt... <zähneknisch> ;-)
Nur nicht aufgeben! Und immer fleissig die Dokus lesen, johnny! :-)
Viele Grüsse
Philipp