This is much improved from your previous post. A few points, and one design thing. Design first.
- Your validation functions do not all guarantee a result of the form you want for CGI validation, and they do not have a design that lets you demand non-zero length, first and last name, etc. They are good for detainting, but validation is skimped.
- You don't need the & sigil before the function calls, and the parens are optional as well. Neither is an important point in your code, but the sigil can alter the behavior of the function.
- Your phone, email and date validators are a too simple for the real world, but I take this to be from simplification for the node. Presumably you will use modules like Email::Valid and others for the real thing.
- I like to put a definite true, like 1; at the end of a sub which modifies its arguments.
- Added: You can get the same error message array, @errmsg, by supplying it to each validator call as $errmsg[@errmsg]. No need to keep track of numbers then.