You can do this in pure Perl, too... you just have to refresh the screen following each selection. I might do it something like this:
my %options = (
main => ["option1", "option2", "option3"],
option1 => ["option1a", "option1b", "option1c"],
option2 => ["option2a", "option2b", "option2c"],
option3 => ["option3a", "option3b", "option3c"]
);
if ( !param() ) {
$values_ref = $options{'main'};
} else {
$values_ref = $options{param('distros_menu')};
}
print start_form();
print popup_menu(
-name => 'distros_menu',
-values => $values_ref,
);
print submit('which_distro_button');
print endform;
But that takes you down the road of outputting HTML via CGI.pm, which will eventually make you want to take your own life. Better would be to use a template like HTML::Template and just output different values to the template on each refresh.
Best solution though is probably either a pure JS or an AJAX-style solution (as already suggested), as it presents a better experience for the user.