Hi Klaus!
Zunächst DANKE für deine AntwortEN(!!!), hatte die untere leider erst gestern abend gefunden, sorry:-)
Du hast Recht, in die Richtung überleg ich schon länger. Leider habe ich erst vor wenigen Wochen mit PERL angefangen, deshalb fehlt mir noch sehr viel Wissen, bin aber auf dem besten Wege, meine noch vorhanden(großen) Lücken langsam zu schließen! Langsa lichtet sich auch der Schleier und ich fange (DANK EUCH) an immer mehr zu verstehen! Ich hab mit den Teil schon angeguckt, aber da ich leider nicht mehr weiter weiß überlege ich, evtl. den unteren Teil zu verändern. Wenn ich den oberen Teil so belasse, kann man dann die Variablen, die ich unten verwende(die dann natürlich den Namen der input-Felder entsprechen sollten) so weiter verwenden?
Also ich hab mir den Code nochmal genauer angeguckt:
read(STDIN,$query_string,$ENV{'CONTENT_LENGTH'});
OK
$time_gap=$time_transfare_seconds+($time_transfare_minutes*60)+($time_transfare_hours*60*60);
if($query_string !~ /\S|=/){
&produce_error(
"You Did not access the script through an HTML form"
);
}
unless($csv_file=&pick_up("file",$query_string)){
&produce_error(
"You did not provide your HTML form with a CSV file path."
);
}
Kann ich den ganzen Quatsch nicht weglassen, ist doch nur dazu da, am Anfang feststelen zu können, warum es nicht läuft, oder? Reicht dafür nicht:
$csv_file=&pick_up("file",$query_string
@pairs=split("&",$query_string);
$l=0;
OK
foreach $pair (@pairs){
if($pair=~/[;<>&\*|]/){ &produce\_error( "Using [;<>&\\*
|] meta-characters is frobidden for security reasons."
);
}
($e_names[$l],$e_values[$l])=split("=",$pair);
$e_names[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_names[$l]=~tr/+/ /;
$e_values[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_values[$l]=~tr/+/ /;
Soweit so gut, ist ja eigentlich alles Standard - bis hier.
if($e_names[$l]=~/"|,/){
$e_names[$l]=~s/"/""/g;
$e_names[$l]=""".$e_names[$l].""";
}
if($e_values[$l]=~/"|,/){
$e_values[$l]=~s/"/""/g;
$e_values[$l]=""".$e_values[$l].""";
}
Und das ist nur dazu, Kommas in Punkte zu verwandeln, richtig? Da ich vorher eh Skripte habe, die das (noch) nicht können bringt das auch nichts, sowieso wird auch der letzten Formularseite eh kein Eintrag gemacht, bei dem das relevant sein könnte, der Rest steht in hidden-Fields, die schon ein oder 2 Scripte durchlaufen haben. Oder verstehe ich hier was falsch?
$l=$l+1;
heißt das, alle geraden Elemente enhalten Namen, und alle ungeraden Variablen?
}
</code>
Also, jetzt weiß (in etwa) was hier so gemacht wird. Jedenfalls verstehe ich jetzt einiges besser als vorher, unter anderem auch wie das SELFHTML Beispielscript genau funktioniert, vorher konnte ich es lediglich anpassen, ohne genau zu wissen, warum da jetzt was steht!
Aber jetzt wird es wieder kompliziert:
Ich würde jetzt diesen Teil durch
use CGI;
$query_string = new CGI;
@pairs = $query_string->param;
$l=0;
foreach $pair (@pairs)
($e_names[$l],$e_values[$l])=split("=",$pair);
$e_names[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_names[$l]=~tr/+/ /;
$e_values[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_values[$l]=~tr/+/ /;
if($e_names[$l]=~/"|,/){
$e_names[$l]=~s/"/""/g;
$e_names[$l]=""".$e_names[$l].""";
}
if($e_values[$l]=~/"|,/){
$e_values[$l]=~s/"/""/g;
$e_values[$l]=""".$e_values[$l].""";
}
$l=$l+1;
}
Naja, ist garantiert total falsch, aber ich kenne keine Möglichkeit, Listen mit cgi.pm kpl. einzulesen, ich weiß nur, wie ich alle Variablen einzend einlese. Oder geht das in Richtung:
$pairs = $query_string->param('@pairs');
$e_names = $query_string->param('@e_names');
$e_values = $query_string->param('@e_values');
Aber da sehe ich mind. 2 Probleme, erstens ist das glaub ich gar nicht möglich, @... als param, 2. fehlt mit dann die Definition, was überhaupt Name und was Wert ist, halt das mit $l=0; und $l=$l+1;
und da es dann mit
$l_e_names=@e_names;
$l_e_values=@e_values;
weiter geht, kann das gar nicht funktionieren.
Ich kenne das leider nur, dass eine Liste, z.B. @namen eingelesen wird, und dann muß ich mir aber die einzelnen Variablen noch "von Hand" holen.
Könnte ich denn(angenommen ich bekomme diesen Teil irgendwann mal hin) dann unten die Variablen, z.B. 'email'... schon als bekannt voraussetzen und dann
$email= $query_string->param('email');
weglassen?
Eigenlich wäre mir das wie oben gesagt anders herum etwas lieber - wenn ich die Variablen unten im SendMail Unterbereich verwenden könnte, also man kann mit der ursprünglichen Methode ja auch an die Variablen, die ich für meine Mail brauche, von Hand kommen. Ist bestimmt mehr Schreibaufwand, aber ich glaube vom Programmier-Niveau etwas einfacher.
Ich dachte da an sowas, wie
$empfaenger_mail = $e_values[$email];
und das dann einfach unten im SendMail Teil so:
print MAIL "To: $empfaenger_mail\n";
einsetzten.
Oder geht das auch nicht so einfach? Ich würde dann aus dem Sub-Programm den use cgi und alles mit param löschen und dafür die Variablen wie gerade Beschrieben definieren - wenn das überhaupt geht. Was hälst Du davon? Sicher würde mir Deine vorgeschlagene Variante besser gefallen, aber da weiß ich einfach nicht weiter. Vielleicht hast Du ja noch einen kleinen Denkanstoß für mich;-))
Wie Du siehst bin ich wrklich bemüht, alles zu verstehen und selbst nach einer Lösung zu suchen, ich mache mir auch sehr viele Gedanken dazu, meist leider mit nur eher mäßigem Erfolg, aber langsam verstehe ich alles immer besser. Ich wolte mich auch nochmal ganz herzlich für Deine bisherige Hilfe bedanken, hat mir schon SEHR viel gebracht, nicht nur das ich am Script weiterkomme, sondern das Du mir hilfst PERL zu verstehen! Das ist nicht selbstverständlich, denn Du hast Dir auch Zeit genommen, auf meine Fragen die Euch bestimmt manchmal nerven, super-ausführlich zu antworten, das weiß ich zu schätzen:-) Ich weiß, es ist noch sehr viel, was ich noch lernen muß - ich bemühe mich so gut ich kann und probiere so viel wie möglich aus, ich kann Dir versichern, dass ich bestimmt keinen fertigen Code von jemandem haben möchte, sondern nur dass mir Leute so wie Du gelegentlich ein paar Denkanstöße geben oder sagen, wo meine Fehler liegen!
Mit besonders freundlichem Gruß,
Alexander