Hallo,
valid($error,$forumname,$email,$abfrage,$auswahl);
if (!$error) {
savemail($forumname,$email,$abfrage);
main();
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.
Ü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);
HTH
Klaus