Mira la sinopsis del módulo
CGI, donde hay un ejemplo de cómo crear información HTML a partir de funciones del módulo.
Para lo del formulario... enlazas el formulario desde otra página. Al principio del programa compruebas el valor de los parámetros que el usuario te haya pasado (con params(), por ejemplo). En la primera invocación, no habrá nada, así que sabrás que tienes que pintar el formulario vacío. Pero si hay parámetros, es que el usuario ha recargado la página o ha pulsado el botón de envío. Esto último también lo compruebas mirando el param() correspondiente, y actúas según el caso.
Mira mi
CGI mínimo, donde puedes ver cómo se accede a los parámetros.