#!/usr/bin/perl
# Example - Params::Util - Named
use strict;
use warnings;
use Carp;
use Data::Dumper;
use Params::Util qw( _STRING _POSINT );
my ( $state_re, $zip_re, $non_blank_re ) = do 'common.pl';

sub check_zip {
    my %args = @_;
    my $name    = _STRING( delete $args{Name}  ) or croak 'Invalid name';
    my $address = _STRING( delete $args{Addr}  ) or croak 'Invalid address';
    my $city    = _STRING( delete $args{City}  ) or croak 'Invalid city';
    my $state   = _STRING( delete $args{State} ) or croak 'Invalid state';
    my $zip     =          delete $args{Zip};
    croak 'Too many arguments' if %args;
    croak 'Invalid state' if $state !~ /$state_re/;
    croak 'Invalid zip'   if defined $zip and ( !_POSINT($zip) or $zip !~ /$zip_re/ );

    print Dumper $name, $address, $city, $state, $zip;
}
sub do_it {
    check_zip(
        Name => 'Me',
        Addr => '1313 M Lane',
        City => 'Auburn',
        State => 'AL',
        Zip   => 36831,
    );
}
do_it();
