| File: | blib/lib/Geo/Address/Parser/Rules/AU.pm |
| Coverage: | 77.5% |
| line | stmt | bran | cond | sub | time | code |
|---|---|---|---|---|---|---|
| 1 | package Geo::Address::Parser::Rules::AU; | |||||
| 2 | ||||||
| 3 | 1 1 1 | 188 1 18 | use strict; | |||
| 4 | 1 1 1 | 2 0 18 | use warnings; | |||
| 5 | 1 1 1 | 6 1 163 | use Exporter 'import'; | |||
| 6 | our @EXPORT_OK = qw(parse_address); | |||||
| 7 | ||||||
| 8 | our $VERSION = '0.07'; | |||||
| 9 | ||||||
| 10 | # Australian states and territories (2â3 letter abbreviations) | |||||
| 11 | my $state_re = qr/\b(ACT|NSW|NT|QLD|SA|TAS|VIC|WA)\b/i; | |||||
| 12 | ||||||
| 13 | # Australian postcode (4 digits) | |||||
| 14 | my $postcode_re = qr/\b(\d{4})\b/; | |||||
| 15 | ||||||
| 16 | sub parse_address { | |||||
| 17 | 1 | 1 | my ($class, $text) = @_; | |||
| 18 | 1 | 1 | return unless defined $text; | |||
| 19 | ||||||
| 20 | 1 4 | 2 10 | my @parts = map { s/^\s+|\s+$//gr } split /,/, $text; | |||
| 21 | ||||||
| 22 | 1 | 1 | my ($name, $road, $suburb, $state, $postcode); | |||
| 23 | ||||||
| 24 | # Match state + postcode at end | |||||
| 25 | 1 | 30 | if ($parts[-1] =~ /$state_re\s*$postcode_re/) { | |||
| 26 | 1 | 2 | $state = uc($1); | |||
| 27 | 1 | 1 | $postcode = $2; | |||
| 28 | 1 | 1 | pop @parts; | |||
| 29 | } elsif ($parts[-1] =~ /^$state_re$/) { | |||||
| 30 | # Match state only | |||||
| 31 | 0 | 0 | $state = uc($1); | |||
| 32 | 0 | 0 | pop @parts; | |||
| 33 | } | |||||
| 34 | ||||||
| 35 | 1 | 1 | $suburb = pop @parts if @parts; | |||
| 36 | 1 | 1 | $road = pop @parts if @parts; | |||
| 37 | 1 | 2 | $name = join(', ', @parts) if @parts; | |||
| 38 | ||||||
| 39 | return { | |||||
| 40 | 1 | 4 | name => $name, | |||
| 41 | road => $road, | |||||
| 42 | suburb => $suburb, | |||||
| 43 | region => $state, | |||||
| 44 | postcode => $postcode, | |||||
| 45 | }; | |||||
| 46 | } | |||||
| 47 | ||||||
| 48 | 1; | |||||
| 49 | ||||||