File Coverage

File:blib/lib/Geo/Address/Parser/Rules/US.pm
Coverage:84.2%

linestmtbrancondsubtimecode
1package Geo::Address::Parser::Rules::US;
2
3
2
2
2
417
2
30
use strict;
4
2
2
2
5
1
41
use warnings;
5
2
2
2
14
3
290
use Exporter 'import';
6our @EXPORT_OK = qw(parse_address);
7
8our $VERSION = '0.07';
9
10 - 42
=head1 NAME

Geo::Address::Parser::Rules::US - Parsing rules for US addresses

=head1 DESCRIPTION

Extracts name, street, city, region, and ZIP code from a flat US address string.

=head1 EXPORTS

=head2 parse_address($text)

Returns a hashref with keys:

=over

=item * name

=item * street

=item * city

=item * region

This contains the state.

=item * postcode

This contains the zip code.

=back

=cut
43
44sub parse_address {
45
2
3
        my ($class, $text) = @_;
46
47
2
2
        return unless defined $text;
48
49        # Split by commas and trim whitespace
50
2
8
4
20
        my @parts = map { s/^\s+|\s+$//gr } split /,/, $text;
51
52
2
2
        my ($name, $street, $city, $region, $zip);
53
54        # Try to extract region + ZIP code from last part
55
2
6
        if ($parts[-1] =~ /^([A-Z]{2})\s*(\d{5}(?:-\d{4})?)?$/) {
56
2
2
                $region = $1;
57
2
4
                $zip = $2 // '';
58
2
2
                pop @parts;
59        }
60
61
2
2
        $city = pop @parts if @parts;
62
2
3
        $street = pop @parts if @parts;
63
2
3
        $name = join(', ', @parts) if @parts;
64
65        return {
66
2
12
                name => $name,
67                street => $street,
68                city => $city,
69                region => $region,
70                postcode => $zip,
71        };
72}
73
741;
75