in reply to regexp

What does your input look like? I'd do something like this:
my $input = "Holland, MI 82904-4413"; my ($city, $state, $zip) = split(' ', $input); $city =~ s/,$//; bad_zip($zip) unless ($zip =~ /^\d{5}(-)?(\d{4})?$/);
Optimize as necessary.