My random commentary:
- In the first paragraph you use the phrase "HERE documents" and later on you use the same phrase but put the word "HERE" in double quotes (as I have just done). I've always found the all-caps version of that phrase rather strange. Usually, I just use a hyphenated form: here-documents.
- I didn't see anything in a casual glance through the lessons, but might you explain your code such that the lesson can stand on its own? For instance, if I didn't know anything, I'd have questions like: What's the -T option for? Why use strict; use warnings;? etc. One of the things I've always liked about merlyn's articles is that he almost always starts off explaining the code with "As usual, I have blah blah blah at the top of my program because of blah blah blah". Anyway, a small paragraph explaining that stuff immediately after the code and giving pointers to docs would be an improvement IMHO (perhaps in a call-out box like your debugging tips (I'd factor the -T discussion out of debugging tips probably)).
- The text right before the code for the form says "The form looks something like this". Well, really it's the code that implements the form, not the form itself that you're illustrating.
- When you talk about the roll and roll_dice subroutines, you write &roll and &roll_dice; respectively. I'd forego the ampersands and semicolon.
- I didn't scrutinize the code closely, but it looked good to me. (Though I did find the sublty of why you didn't use the fat comma for %races a little distracting. But if you wanted to make that a "sublesson", you could add an exercise for it)
Sorry if my comments sound nit-picky, these are just the things that occured to me as I looked over the lesson.
Anyway, it's nice to know that I can point people at your lessons whenever they ask for a CGI course. Keep up the good work!