File Coverage

File:blib/lib/Geo/Address/Parser/Rules/AU.pm
Coverage:77.5%

linestmtbrancondsubtimecode
1package 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';
6our @EXPORT_OK = qw(parse_address);
7
8our $VERSION = '0.07';
9
10# Australian states and territories (2–3 letter abbreviations)
11my $state_re = qr/\b(ACT|NSW|NT|QLD|SA|TAS|VIC|WA)\b/i;
12
13# Australian postcode (4 digits)
14my $postcode_re = qr/\b(\d{4})\b/;
15
16sub 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
481;
49