On Mon, Feb 6, 2012 at 3:14 PM, <sono...@fannullone.us> wrote:

>        So I'm creating a hash of arrays that contains a list of Zip Codes
> for the United States.  I've also written a foreach loop to access this
> hash but I'd like to see if it could be written better.  For example, do I
> really need three foreach loops?
>
<snip>

> #!/Users/perl5/perlbrew/perls/perl-5.14.1/bin/perl
> use strict;
> use warnings;
>
> my %states = (
>        AL => [ '350','351', ],
>        AK => [ '995','996', ],
>        AZ => [ '850','851', ],
>        AR => [ '716','717', ],
> );
>
> my $customers_state = 'AZ';
> my $customers_zip = '850';
> my $match = 'no' ;
>
> STATE:  foreach my $state (keys %states) {
> #                       print "$state \n";
>                        if ($state eq $customers_state) {
>                                foreach (@{$states{$customers_state}}) {
>                                        my @zips = $_;
> ZIP:                            foreach my $zip (@zips) {
>                                                next ZIP if $zip ne
> $customers_zip;
>                                                        $match = 'yes';
> #                                                       print "\nZip
> matches the State \n";
>                                        }
>                                }
>                        last STATE;
>                        }
>                }
> print $match;
>

You can also key the hash with the first three digits and skip the loops
altogether.


> my %zips = (
    350 => 'AL',
    351 => 'AL',
    995 => 'AK',
    996 => 'AK',
    850 => 'AZ',
    851 => 'AZ',
    716 => 'AR',
    717 => 'AR',
);

> my $customers_state = 'AZ';
my $customers_zip = '850';

if (
    exists( $zips{$customers_zip} )
    and $zips{$customers_zip} eq $customers_state
) { print 'yes'; }
else { print 'no'; }

-- 
Robert Wohlfarth

Reply via email to