A couple of comments on
pod2usage, um, usage :)
Since pod2usage by default exits, your explicit exit calls are redundant at best and confusing at worst. This
pod2usage(-verbose => 1) && exit if defined $opt_help;
is the same as this:
pod2usage(-verbose => 1) if defined $opt_help;
You could also take advantage of the -message option. This
print "$0: input_file required\n";
pod2usage(-verbose => 0) && exit
is the same as this:
pod2usage(-verbose => 0, -message => "$0: input_file required\n")
A comment on Getopt::Long usage: instead of declaring several separate $opt_XXX scalar variables, it might be more natural Storing options values in a hash.