| File: | blib/lib/Geo/Address/Parser/Rules/US.pm |
| Coverage: | 84.2% |
| line | stmt | bran | cond | sub | time | code |
|---|---|---|---|---|---|---|
| 1 | package 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'; | |||
| 6 | our @EXPORT_OK = qw(parse_address); | |||||
| 7 | ||||||
| 8 | our $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 | ||||||
| 44 | sub 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 | ||||||
| 74 | 1; | |||||
| 75 | ||||||