Last weekend when I was working on the script that mirrors and presents radar data for mobile use, I decided the less work I had to do, the better. To that end, I tried to make heavy use of the CGI.pm Perl module. In addition to handling the CGI input, CGI.pm also prints regular HTML tags, so you can avoiding having to throw a bunch of HTML markup in your print statements. This makes for much cleaner code and reduces the chances you’ll make a silly formatting mistake.
Everything was going well until I added the popup menu to select the radar product. Initially I followed the example in the documentation and it worked. As I went on, I decided instead of having two hashes for the product information, it made sense to make my hash include not only the product description, but the URL pattern I’d be using when it came time to mirror the image. Unfortunately, when I tried to make that change, my popup form no longer had the labels I wanted.
I kept poking at it for a while and finally got frustrated to the point where I decided I’d just write a foreach and have that part print the HTML markup instead of using CGI.pm functions. Fortunately, I first talked to my friend Mike about it. I sent him the code and after a little bit of working, he realized what my problem was. CGI.pm’s popup_menu function expects a pointer to a hash for labels, not an array (I’m not really sure why, maybe someone can explain it?). Once that was settled, the script worked as expected and the remainder was finished in short order.
Sometimes, it really helps to pay attention to the data type that a function expects.