sub hidden_field { my $counter = $cgi->param('field_1'); if ( not defined $counter ) { $counter = 1; } else { $counter++; } print $cgi->hidden('field_1', $counter); return $counter; } my $count = hidden_field; foreach ( 1 .. $count ) { #here is a seperate function that generates set of 3 text_area }