| File: | blib/lib/Geo/Address/Parser/Rules/NZ.pm |
| Coverage: | 84.2% |
| line | stmt | bran | cond | sub | time | code |
|---|---|---|---|---|---|---|
| 1 | package Geo::Address::Parser::Rules::NZ; | |||||
| 2 | ||||||
| 3 | 2 2 2 | 390 2 34 | use strict; | |||
| 4 | 2 2 2 | 3 2 59 | use warnings; | |||
| 5 | ||||||
| 6 - 10 | =head1 VERSION Version 0.07 =cut | |||||
| 11 | ||||||
| 12 | our $VERSION = '0.07'; | |||||
| 13 | ||||||
| 14 | 2 2 2 | 4 7 257 | use Exporter 'import'; | |||
| 15 | our @EXPORT_OK = qw(parse_address); | |||||
| 16 | ||||||
| 17 | # NZ postcode: 4 digits | |||||
| 18 | my $postcode_re = qr/\b(\d{4})\b/; | |||||
| 19 | ||||||
| 20 | sub parse_address { | |||||
| 21 | 3 | 10 | my ($class, $text) = @_; | |||
| 22 | 3 | 4 | return unless defined $text; | |||
| 23 | ||||||
| 24 | 3 12 | 6 41 | my @parts = map { s/^\s+|\s+$//gr } split /,/, $text; | |||
| 25 | ||||||
| 26 | 3 | 4 | my ($name, $road, $suburb, $city, $postcode); | |||
| 27 | ||||||
| 28 | 3 | 60 | if ($parts[-1] =~ /(.+?)\s+($postcode_re)$/) { | |||
| 29 | 3 | 5 | $postcode = $2; | |||
| 30 | 3 | 3 | $parts[-1] = $1; # keep city without postcode | |||
| 31 | } | |||||
| 32 | ||||||
| 33 | 3 | 5 | $city = pop @parts if @parts; | |||
| 34 | 3 | 3 | $suburb = pop @parts if @parts; | |||
| 35 | 3 | 4 | $road = pop @parts if @parts; | |||
| 36 | 3 | 4 | $name = join(', ', @parts) if @parts; | |||
| 37 | ||||||
| 38 | return { | |||||
| 39 | 3 | 16 | name => $name, | |||
| 40 | road => $road, | |||||
| 41 | suburb => $suburb, | |||||
| 42 | city => $city, | |||||
| 43 | postcode => $postcode, | |||||
| 44 | }; | |||||
| 45 | } | |||||
| 46 | ||||||
| 47 | 1; | |||||
| 48 | ||||||