Schrift
[thread]10797[/thread]

Anzeige einer require() Datei nur einmal

Leser: 3


<< >> 7 Einträge, 1 Seite
mkessler
 2007-11-14 17:51
#102418 #102418
User since
2007-11-14
2 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich habe folgendes Problem: Ich baue mir z.Z. ein spartanisches Gästebuchscipt mit Perl um mir ein paar Grundkenntnisse anzueignen (das Gästebuch ist nicht für die Öffentlichkeit bestimmt, daher auch ohne CSS usw. usf.) . Nun prüfe ich, welche Funktion im GET Parameter 'do' eingesetzt wurde, je nachdem zeigt er mir die entsprechenden Inhalte an.

Nun habe ich das mit dem Wert "add" gemacht, der mir die add.pl einbinden soll (require). Seltsamerweise zeigt Perl mir die Seite nur einmal an - wenn ich aktualisiere, komme ich auf eine leere Seite. Um mir das nochmal anzusehen, muss ich Apache neustarten. Übrigens: Der Content-Type wird, wenn es denn mal angezeigt wird, völlig missachtet - ich bekomme eine Textausgabe.

index.pl
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/perl
use CGI;
chdir "C:/Users/Martin/Desktop/Server/htdocs/perlbook";

$cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);

require "do.pl";

# Ausgabe des HTTP Headers
print "Content-type: text/html\n\n";

print qq(
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>G&auml;stebuch auf Textseitenbasis mit PERL</title>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  </head>
  <body>
);

# Waehle Content
if ($cgi->url_param('do') eq "") 
{
print qq(
<h1>G&auml;stebuch - Eintr&auml;ge lesen</h1>
);
} 
else
{
if ($cgi->url_param('do') eq "add")
{
require "add.pl" or die("fuck");
}
}



add.pl
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print qq(
<h1>G&auml;stebuch - Eintr&auml;ge verfassen</h1>

<p>Hier k&ouml;nnen Sie einen Eintrag in meinem G&auml;stebuch hinterlassen. Bitte f&uuml;llen Sie das untenstehende Formular aus.</p>

<form method="post">
Name: <input type="text" name="name" size="25" value="">
eMail: <input type="text" name="name" size="25" value="">
Homepage: <input type="text" name="name" size="25" value="http://">
<input type="submit" name="add" value="OK">
</form>
);

if ($cgi->url_param()) {
print "<p><strong>Es wurden nicht alle Felder ausgef&uuml;llt!</strong></p>";
}


System: Windows Vista mit XAMPP 1.6.2 und Mod_Perl 2.0.3 (Perl 5.008008).
pktm
 2007-11-14 18:00
#102419 #102419
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
So prizipell würde ich das require add.pl komplett rausnehmen und durch eine Funktion ersetzen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if ($cgi->param('do') eq "add") {
my $text = add();
print $text;
}

sub add {
my $out = 01: qq~
<h1>G&auml;stebuch - Eintr&auml;ge verfassen</h1>

<p>Hier k&ouml;nnen Sie einen Eintrag in meinem G&auml;stebuch hinterlassen. Bitte f&uuml;llen Sie das untenstehende Formular aus.</p>

<form method="post">
Name: <input type="text" name="name" size="25" value="">
eMail: <input type="text" name="name" size="25" value="">
Homepage: <input type="text" name="name" size="25" value="http://">
<input type="submit" name="add" value="OK">
</form>
);

unless ($cgi->param('parametername???')) {
$out .= "<p><strong>Es wurden nicht alle Felder ausgef&uuml;llt!</strong></p>";
}
return $out;
}


Immer noch nicht die feinste Art, aber shcon einmal ein Schritt in Richtung Besserung.
Außerdem möchte ich dir dringend use strict; und use warnings; empfehlen.
http://www.intergastro-service.de (mein erstes CMS :) )
mkessler
 2007-11-14 18:27
#102421 #102421
User since
2007-11-14
2 Artikel
BenutzerIn
[default_avatar]
Schon, aber es ging mir erstmal um "etwas in Perl zu machen." Das es weitaus feiner geht, z.B. mit Objektorientierung usw. (lerne ich auch gerade mit PHP, aber bis mein Buch da ist wollte ich mir mal anschauen wie Perl so ist^^) ist mir durchaus bewusst.

Ich werde mir deine Lösung mal anschauen. Trotzdem finde ich es merkwürdig, dass er mir den require Befehl so ... komisch ... interpretiert. Ich geh mal davon aus, dass das nicht Standard ist?! Ich lagere, egal ob ich prozedual oder objektorientiert arbeite, immer gerne aus ;).

Ich melde mich wenn es etwas Neues gibt. Sind hier Doppelposts erlaubt? Bei 'nem Edit wirds wahrscheinlich nicht als neu markiert, nehme ich an...^^

Btw: Du hast 'nen 500er auf deiner Seite...^^
Struppi
 2007-11-14 18:54
#102422 #102422
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Quote
01: #!/usr/bin/perl
02: use CGI;


Ich vermute andere Probleme bei dem Skript, da du aber weder Warnungen erzeugst, noch strict verwendest, lassen sich manche Fehler nur schwer finden. Deine Aussage das der Header mißachtet wird deutet aber darauf hin, dass das Skript u.U. schon vorher was ausgibt.

Bau das mal in das Skript ein
Code (perl): (dl )
1
2
3
4
5
#!/usr/bin/perl -w
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
warningsToBrowser(1);

Die Warnungen erscheinen im Quelltext, als HTML Kommentare

und evtl. die Ausgabe des Headers in einem BEGIN Block

[EDIT]Ach, und den XML Prolog würde ich rausschmeissen, du versetzt den IE damit in den Quirksmode, was zu Problemen bei der Darstellung führen kann.
pq
 2007-11-15 00:02
#102425 #102425
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
require() wird nur einmal im verlauf eines prozesses ausgeführt, d.h. wenn perl eine datei
schon geladen hat, laedt es sie nicht nochmal. ist ja auch sinnvoll. wenn das in einem
CGI-script so ist, kann das eigentlich nur bedeuten, dass mod_perl registry eingesetzt
wird. wenn du das laden forcieren willst, musst du do() nehmen, jedoch würde ich davon
abraten, das sieht irgendwie so nach steinzeit aus. mach ein ordentliches modul mit
einer funktion.
Code (perl): (dl )
1
2
3
4
5
6
package Add;
sub add {
}
......
use Add;
Add::add();

zu sagen, ich will es unsauber machen, weil ich ja grad erst anfange, erschliesst sich mir nicht so richtig.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pktm
 2007-11-15 11:26
#102435 #102435
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
mkessler+2007-11-14 17:27:53--
Btw: Du hast 'nen 500er auf deiner Seite...^^


Oh, danke für den Hinweis. Werde es heute im Laufe des Tages angehen.

mkessler+2007-11-14 17:27:53--
Schon, aber es ging mir erstmal um "etwas in Perl zu machen." Das es weitaus feiner geht, z.B. mit Objektorientierung usw. (lerne ich auch gerade mit PHP, aber bis mein Buch da ist wollte ich mir mal anschauen wie Perl so ist^^) ist mir durchaus bewusst.


Nun, das ist so, wie wenn du eine Ausbildung zum Schreiber machst und deinem Ausbilder sagst, dass du jetz ein Brett mit einem Hammer zersägen wirst, weil du das mal lernen möchtest. Und das machst du dann auch: *buff* *buff* *buff* ^^

Genauso wie man ein Brett nicht mit einem Hammer zersägt macht man das, was du versuchst, nichtm it require. Es geht bedingt, aber ein Hammer ist für andere Sachen da. Du könntest ihn z.B. benutzen um einen Nagel in ein Brett zu schlagen, so wie du require benutzen können wirst, wenn du wiederverwendbare Kodeteile auslagerst.

Und da du etwas lernen möchtest, solltest du erst recht strict und warnings anschalten. Denn nur so werden dir deine Fehler auch angezeigt, und du legst dein Programm nicht frustriert zur Seite, weil es etwas macht, mit dem du nicht gerechnet hast (es aber dennoch so geschrieben hast, Perl ist da äußerst robust :)).

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2007-11-15 11:35
#102436 #102436
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
pktm+2007-11-15 10:26:48--
Und da du etwas lernen möchtest, solltest du erst recht strict und warnings anschalten. Denn nur so werden dir deine Fehler auch angezeigt, und du legst dein Programm nicht frustriert zur Seite, weil es etwas macht, mit dem du nicht gerechnet hast (es aber dennoch so geschrieben hast, Perl ist da äußerst robust :)).

Grüße, pktm


Dazu siehe auch diesen Wiki:Artikel.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 7 Einträge, 1 Seite



View all threads created 2007-11-14 17:51.