You don't have to have values for options. On form submit the value for the element is the string value between the opening and closing option tags. So that's not it.
If you take the action out and leave everything else intact, you can see the GET values in the URL bar in your browser:
When I do that, I see the value set. That means your CGI code had something wrong. I created a file called mycgi.pl and put it in the same directory as the HTML file, resulting in this for the form definition:<form name="frmStatusFilter" method="GET"> Choose Filter:<select name="StatusFilterSelect" onChange="frmStatusFil +ter.submit()"> <option>Show with status</option> <option>Show all</option> </select> </form>
<form name="frmStatusFilter" method="GET" action="mycgi.pl">
You would, of course, leave yours as the same, since you have a specific CGI URL already defined.
Then I worked on the contents of mycgi.pl and added some missing CGI method calls:
my $q = new CGI; my $status = $q->param('StatusFilterSelect'); print $q->header(), $q->start_html('Status Report'), $q->h1('Status Report'), $q->p("status is $status"), $q->end_html();
You left off the header, which is very important to tell the browser that what's coming back is an HTML page. You also want the start_html to emit the html, head, and body tags. The h1 is purely optional, the p is for your data, and the end_html closes off the body and html tags to make everything neat, tidy, and validateable.