C'è un errore concettuale, devi essere tu a dire allo script quali subroutine eseguire e quando.

mettiamo che hai il seguente codice:

codice:
use CGI;
my $query = new CGI; 

sub tuo_codice {
#codice che hai postato
}

sub change_pass {
# codice cambio password
}
devi operare i seguenti interventi

codice:
use CGI;
my $query = new CGI; 

if($query->param('change_pass')) {
   &change_pass);
}
else {
   &tuo_codice();
}

sub tuo_codice {
#codice che hai postato
}

sub change_pass {
# codice cambio password
# aggiungi codice html per la pagina di risposta
}

sub print_form {
  ....
  # aggingi agli altri tag
  print $query->hidden(-name => 'change_pass',
                       -value => '1' );
  # non sono sicurissimo della sintassi per la 
  # creazione di tag hidden. Controlla
  ...
}
in questo modo la prima volta che la pagina sarà chiamata visualizzerà il form, la seconda - trovando il tag change_pass - effettuerà le operazioni che ti servono.