[perl] seitenerzeugung fehlerhaft

hallo,

ich habe folgendes problem:
ich nehme von einer html-seite (einem formular) eine ganze reihe von daten entgegen. den kompletten datensatz schreibe ich _ohne_ bearbeitung in eine datei.
ein anderes script liest nun diese datei ein und decodiert die einzelnen daten. diese werden dann in eine html-seite eingefügt. diese seite wird dann angezeigt.
auf meinem rechner (als localhost) unter win98/xitami funzt alles prima. auf dem zielrechner unter linux/apache wird die seite aber doppelt angezeigt und dazu noch mit datenmüll.
aus irgendeinem grund kann linux/apache die daten nicht korrekt einfügen. dafür scheint die seite aber zweimal hintereinander gehängt verschickt zu werden…

wo kann da der fehler liegen ?

CU, DiJey

ein wenig Code wäre hilfreich.

cu, holli

ein wenig Code wäre hilfreich.

hier mal der source:

#!usr/bin/perl

use locale;
use CGI qw(param);

$| = 1; # flushen ein

$Vorlage = "stelle\_view.html";

$CSS = "../../base.css";

# Ermittlung des Scriptnamens und des Verzeichnisses
# und Wechsel in das aktuelle Verzeichnis (CGI)
$base\_dir = rindex ($0, "\\") ;
$base\_dir = rindex ($0, "/") if ($base\_dir hier wird jetzt der datensatz gelesen
 
# einlesen der datei ($Name wird von html-seite übergeben)
open (DATEI, "//g;

# zerlegen in hilfsarray
@x = split("&", $Stelle);

# einlesen in hash
foreach $Wert (@x) {
 %Stelle = (%Stelle, split("=", $Wert));
}

# newlines im hash zu 
 wandeln damit mehrzeilige felder
# mehrzeilig bleiben...
foreach $S (keys (%Stelle)) {
 $Stelle{$S} =~ s/\n/
/g;
}

#--\> und hier die html-vorlage 

# einlesen der vorlage
open (DATEI, ") {
 push (@Lines, $Line);
}
close (DATEI);

#--\> hier werden die daten in die vorlage gesetzt

# ersetzen der platzhalter
foreach $Line (@Lines) {
 $Line =~ s/-titel-/$Stelle{"titel"}/g;
 $Line =~ s/-aufgabe-/$Stelle{"aufgabe"}/g;
 $Line =~ s/-anforderung-/$Stelle{"anforderung"}/g;
 $Line =~ s/-eigenschaft-/$Stelle{"eigenschaft"}/g;
 $Line =~ s/-verfall-/$Stelle{"verfall"}/g;
 $Line =~ s/-gruppe-/$Stelle{"gruppe"}/g;
 $Line =~ s/-firma-/$Stelle{"firma"}/g;
 $Line =~ s/-abtlg-/$Stelle{"abtlg"}/g;
 $Line =~ s/-ansprech-/$Stelle{"ansprech"}/g;
 $Line =~ s/-strasse-/$Stelle{"strasse"}/g;
 $Line =~ s/-ort-/$Stelle{"ort"}/g;
 $Line =~ s/-tel-/$Stelle{"tel"}/g;
 $Line =~ s/-email-/$Stelle{"email"}/g;
 if ($Stelle{"ra"} eq "abt")
 { $Line =~ s/-fa-/Edelhoff ABT/g; }
 else
 { $Line =~ s/-fa-/Buchen UmweltService/g; }
}

# ausgabe der seite
foreach $Line (@Lines) {
 print ("$Line\n");
}

wie gesagt, unter win/xitami ist alles super, nur unter linux/apache…

CU, DiJey

Hi,

hier mal der source:

hm, der ist noch ein wenig ausbaufähig… :smile:

> #!usr/bin/perl


Du heißt ein Perl in /pfad/zu/deinem/cgi-bin/usr/bin/perl? :wink:

#!/usr/bin/perl -w
use strict;

[...]


> $Vorlage = "stelle\_view.html";


my $Vorlage = 'stelle\_view.html';

Das "my" wegen perldoc -f my, und bitte Doublequotes nur dann, wenn Du auch wirklich Stringparsing brauchst.

[...]


> my ($Name) = param("name");


Und hier würde "my $Name" ohne Klammern reichen :smile:

Übrigens gibt es wegen Groß- und Kleinschreibung einige Konventionen, die zwar nicht zwingend sind, aber das Lesen Deiner Codes leichter machen können. Variablennamen (eigene) schreibt man demnach klein.



> open (DATEI, ";

}



> # Rück-Konvertieren der Umlaute


Hm, wenn Du mit Hilfe von CGI.pm den Code geschrieben hast, ist das eigentlich schon geschehen... ein erneutes Konvertieren erzeugt dann natürlich Fehler. Aber gut:

$Stelle = CGI::unescape($Stelle);



> # zerlegen in hilfsarray


Ich glaube, ich habe zu viel von dem Code hier gelöscht, jedenfalls verstehe ich nicht mehr wirklich, woher der Input Deines Codes stammt (naja, aus einer Datei \*g\*).



> # einlesen der vorlage  
> open (DATEI, ") {  
> push (@Lines, $Line);  
> }


my @Lines = ;

(Vorausgesetzt, Du hattes $/ wirklich nur lokal neu gesetzt :wink: )



> # ersetzen der platzhalter  
> foreach $Line (@Lines) {

[...]

Hm, da könnte man mit einem Hash vermutlich eine effizientere Methode finden, die zudem leichter zu warten ist. Sind alle diese Platzhalter durch m/-[a-z]+-/g zu finden, und gibt es dieses Pattern nirgendwo sonst?



> # ausgabe der seite  
> foreach $Line (@Lines) {  
> print ("$Line\n");  
> }


{
local $" = "\n";
print "@Lines";
}

wie gesagt, unter win/xitami ist alles super, nur unter
linux/apache…

Laß mich mal raten: mod_perl installiert? => http://perl.apache.org/

Cheatah

hi,

hm, der ist noch ein wenig ausbaufähig… :smile:

he, ich habe vor 4 wochen noch nicht mal gewusst, daß es perl gibt…
dafür mache ich mich doch schon recht gut :smile:

Du heißt ein Perl in /pfad/zu/deinem/cgi-bin/usr/bin/perl? :wink:

ich habe keine ahnung, wo perl auf dem intranetserver liegt - aber es läuft…

Laß mich mal raten: mod_perl installiert? =>
http://perl.apache.org/

das problem liegt eigentlich nicht im script (glaube ich jedenfalls nicht). so wie es aussieht ruft apache das script zweifach auf. wenn ich mir das ergebnis als html-source ansehe ist die tzu erzeugende seite 2x vorhanden…

CU, DiJey

Hi,

hm, der ist noch ein wenig ausbaufähig… :smile:

he, ich habe vor 4 wochen noch nicht mal gewusst, daß es perl
gibt…
dafür mache ich mich doch schon recht gut :smile:

das stimmt. Bei mir kam ein solch… kreativer Mischmasch erst sehr viel später :wink:

Du heißt ein Perl in /pfad/zu/deinem/cgi-bin/usr/bin/perl? :wink:

ich habe keine ahnung, wo perl auf dem intranetserver liegt -
aber es läuft…

Das ist seltsam. Ändere die Shebang-Zeile doch mal auf
#!/usr/bin/perl -w
(das „-w“ solltest Du in Scripts immer benutzen; hier wird es allerdings viele Warnungen erzeugen… laß es also für Probezwecke ruhig weg) bzw. auf das, was Dir die Admins nennen.

Laß mich mal raten: mod_perl installiert? =>
http://perl.apache.org/

das problem liegt eigentlich nicht im script (glaube ich
jedenfalls nicht).

Möglicherweise sowohl am Script als auch am Server. Wenn mod_perl installiert ist, ist Dein Script nicht darauf vorbereitet; obige URL hilft dabei. Interviewe doch mal die Admins ein wenig.

so wie es aussieht ruft apache das script
zweifach auf. wenn ich mir das ergebnis als html-source ansehe
ist die tzu erzeugende seite 2x vorhanden…

Tja, dieser spezielle Effekt ist mir unbekannt. Hast Du die Möglichkeit, das Script auch im Internet unterzubringen? Wenn dort unter ähnlichen Bedingungen der gleiche Fehler auftaucht, kann ich vielleicht ein wenig Analyse betreiben. Wenn nicht, mußt Du Dein Script an die spezielle Serverkonfiguration anpassen, bzw. mit den Admins zusammen einen anderen Weg finden.

Cheatah