You might want to look at How a script becomes a module. The idea described there is to write the program in a way that can be loaded as a module for testing specific subroutine functionality, or can be run as a program. For the more macro input/output testing, you may also want to see the template I offered in Re: Test driven development and glue code
Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.