#!/usr/bin/perl -w
use strict;

use CGI qw/ header /;
my($cgi) = CGI->new();

print header, &get_form_page( $cgi->param('next page') || 'page 1' );

sub get_form_page { $cgi->delete('next page'); <<__OUTPUT__ }
<?xml version="1.0" encoding='ISO-8859-1'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html
xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en"
lang="en">
   <head>
      <title>Multi-Step Form Example</title>
   </head>
   <body>
      <p>&#160;</p>
      ${\ &forms(@_) }
      <p>&#160;</p>
   </body>
</html>
__OUTPUT__

sub preserve_previous { join '', map { eval <<'__PRESERVE__' } $cgi->param }
<<__HIDDEN__
   <input
    type="hidden"
    name="$_"
    value="${\ join ',', @{[ $cgi->param($_) ]} }" />
__HIDDEN__
__PRESERVE__

sub forms { eval( {
   'page 1' => <<'__HTML__',
<<__FORM__
   <h2>Form Page One</h2>
   <form
    name="page 1"
    method="post"
    action="${\ ($cgi->self_url('query_string' => 0) || '') }">
   <input type="hidden" name="next page" value="page 2" />
   <table>
      <tr>
         <td> Enter Your Name </td>
         <td> <input type="text" name="Name" /> </td>
      </tr>
      <tr>
         <td> Enter Your Age </td>
         <td> <input type="text" name="Age" /> </td>
      </tr>
      <tr>
         <td colspan="2"> <input type="submit" value="go to step 2" /> </td>
      </tr>
   </table>
   </form>
__FORM__
__HTML__
   'page 2' => <<'__HTML__',
<<__FORM__
   <h2>Form Page Two</h2>
   <form
    name="page 2"
    method="post"
    action="${\ ($cgi->self_url('query_string' => 0) || '') }">
   <input type="hidden" name="next page" value="page 3" />
   <table>
      <tr>
         <td> Enter Your Weight </td>
         <td> <input type="text" name="Weight" /> </td>
      </tr>
      <tr>
         <td> Enter Your IQ </td>
         <td> <input type="text" name="IQ" /> </td>
      </tr>
      <tr>
         <td colspan="2"> <input type="submit" value="go to step 3" /> </td>
      </tr>
   </table>
   ${\ (&preserve_previous||'') }
   </form>
__FORM__
__HTML__
   'page 3' => <<'__HTML__',
<<__FORM__
   <h2>Form Page Three</h2>
   <form
    name="page 3"
    method="post"
    action="${\ ($cgi->self_url('query_string' => 0) || '') }">
   <input type="hidden" name="next page" value="thank you" />
   <table>
      <tr>
         <td> Enter Your Gender </td>
         <td> <input type="text" name="Gender" /> </td>
      </tr>
      <tr>
         <td> Enter Your Marital Status </td>
         <td> <input type="text" name="MStatus" /> </td>
      </tr>
      <tr>
         <td colspan="2"> <input type="submit" value="finish questions" /> </td>
      </tr>
   </table>
   ${\ (&preserve_previous||'') }
   </form>
__FORM__
__HTML__
   'thank you' => <<'__HTML__',
<<__FORM__
   <h2>All Done, Thank you ${\ ($cgi->param('Name')||'Anonymous person') }.</h2>
   <div>
      <ul>
         <li>
            You are ${\ ($cgi->param('Age')||'0') } years old,
            or so you say...
         </li>
         <li>
         A ${\ ($cgi->param('MStatus')||'single') }
         ${\ ($cgi->param('Gender')||'eunuch') }
         </li>
         <li>
            -and you expect me to believe you only weigh
            ${\ ($cgi->param('Weight')||'0') } lbs. and have an IQ of
            ${\ ($cgi->param('IQ')||'0') }.
         </li>
      </ul>
   </div>
__FORM__
__HTML__
   }
   ->{ shift(@_) || 'page 1' } )
}