Hallo,
Ich mach das immer so, daß ich bei der Formularanzeige bereits Vorbelegungen vornehme:
my $vorn = param('vorn');
[...]
print qq!<input type="text" name="vorn" value="$vorn">!;
(um bei Deinem Beispiel zu bleiben)
Sollte das Formular erstmalig generiert werden, so ist $vorn leer, es steht also auch nichts im HTML-Formular. Sollte das Formular ein zweites Mal angezeigt werden, da, wie Du es willst, eventuell einige Felder nicht ausgefüllt werden, so wird eben der beriets eingegebene Inhalt vorbelegt.
Einziges 'Problem' dabei ist, daß ein eventuell vorhandener Reset-Button dann nicht mehr gleich wie auf der ersten Seite funktioniert, da er ja die vom Server übergebenen Werte wieder in die Formularfelder einträgt.
Etwas anders läuft es ab, wenn Du für die Ausgabe die in CGI.pm bereitgestellte Funktion textfield verwendest.
Da ist dan nämlich so, daß, quasi automatisch, eine Vorbelegung des Textfeldes erfolgt, wenn param('vorn') einen Wert zurückliefert.
ein
print textfield('vorn');
ergibt also im ersten Umlauf
<input type="text" name="vorn">
und im zweiten (falls unter vorn XY eingetragen wurde)
<input type="text" name="vorn" value="XY">
Näheres dazu findest Du unter
perldoc CGI (Abschnitt: CREATING A TEXT FIELD)
bzw. im Code von CGI.pm (sub _textfield)
Grüße
Klaus