Thanks for posting that link, toolic.
I hadn't even considered anyonymous subroutines, or objects, since I've been just calling simple normal subroutines.
In my simple case, I think a script could be written to:
1) Find all subroutines by doing a grep for ^\s*sub\s+\S+
2) Find all subroutines called in the main program.
3) Recursively follow every subroutine used, and look for subroutines within subroutines.
4) At the end, you have a list of every subroutine, and a list of every subroutine used
The hardest part may be deciding what a simple subroutine call looks like:
&mysub
&mysub(args)
mysub
mysub(args)