Hi,
Hier wird main() ohne Parameter aufgerufen, während sonst immer Parameter mit übergeben werden. Dadurch werden die korrespondierenden lokalen Variablen in main() mit undef befüllt, was zu genannter Warung führt.
Mit einer Typisierung der Funktion währe Dir das nicht passiert.
Ich habe zur Probe mal main() so aufgerufen &main;, aber die Meldung kommt trotzdem. Ich glaube es ist so wie Cheatah sagt.
Übrigens macht es IMHO wenig Sinn, Variablen mit Referenzen zu übergeben, wenn Du sie eigentlich gar nicht ändern willst, so wie Du es mit valid() machst. Nicht nur, daß deren Handling komplizierter wird, es besteht auch die Gefahr sie versehentlich zu modifizieren, was dieser Funktion augenscheinlich nicht zusteht. Außerdem können Funktionen auch Rückgabewerte haben. In der genannten Funktion könnte dies $error sein. Bei geeigneter Wahl des Funktionsnamen und des Rückgabewertes kann das zu schönen Konstrukten führen.
Bei deinem Beispiel könnte das so aussehen:
...
wobei mir noch etwas auffällt.
main() soll eigentlich immer aufgerufen, es ist daher nicht sinnvoll, diesen Aufruf auch mehrfach zu kodieren. Und die Variableninitialisierung könnte auch einfacher sein.
Nach etwas ummodel sieht mein Vorschlag dann so aus:
my $error = '';
my ($forumname,$email,$auswahl) = ('','','');
my$forumname = $query->param('name')||'';
my $email = $query->param('email')||'';
my $abfrage = $query->param('janein')||'';
my $auswahl = '';
if (($query->param('action') and ($error = valid($forumname,$email,$abfrage,$auswahl))){
savemail($forumname,$email,$abfrage)
}
main($forumname,$email,$auswahl);
Hmmmm ja da müsste ich ja $error erst wieder zerlegen, und dann die verschiedenen Value's des Formulars mit den Werten füllen, aber ich werde mir das Konstrukt merken, so wie es ist.
$xNeTworKx