Geo::Postcode is a Perl module that will accept full or partial UK postcodes, validate them against the official spec, separate them into their significant parts, translate them into map references or co-ordinates and calculate distances between them.
It does not check whether the supplied postcode exists: only whether it is well-formed according to British Standard 7666, which you can find here:
Geo::Postcode will also work with partial codes, ie areas, districts and sectors. They won't validate, but you can test them for legitimacy with a call to valid_fragment, and you can still turn them into grid references.
To work with US zipcodes, you need Geo::Postalcode instead.
my $postcode = Geo::Postcode->new('SW1 1AA');
return unless $postcode->valid;
my ($n, $e) = ($postcode->gridn, $postcode->gride);
# is the same as
my ($n, $e) = $postcode->coordinates;
# and alternative to
my @location = ($postcode->lat, $postcode->long);
# or the impatient can skip the construction step:
my ($n, $e) = Geo::Postcode->coordinates('SW1 1AA');
my $clean_postcode = Geo::Postcode->valid( $postcode );
my ($unit, $sector, $district, $area) = Geo::Postcode->analyse('SW1 1AA');