line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Number::Phone::JP::AreaCode; |
2
|
5
|
|
|
5
|
|
5728
|
use 5.008005; |
|
5
|
|
|
|
|
18
|
|
|
5
|
|
|
|
|
261
|
|
3
|
5
|
|
|
5
|
|
24
|
use strict; |
|
5
|
|
|
|
|
9
|
|
|
5
|
|
|
|
|
134
|
|
4
|
5
|
|
|
5
|
|
34
|
use warnings; |
|
5
|
|
|
|
|
8
|
|
|
5
|
|
|
|
|
113
|
|
5
|
5
|
|
|
5
|
|
3194
|
use utf8; |
|
5
|
|
|
|
|
29
|
|
|
5
|
|
|
|
|
20
|
|
6
|
5
|
|
|
5
|
|
3976
|
use parent qw/Exporter/; |
|
5
|
|
|
|
|
1466
|
|
|
5
|
|
|
|
|
26
|
|
7
|
5
|
|
|
5
|
|
9650
|
use Encode; |
|
5
|
|
|
|
|
64316
|
|
|
5
|
|
|
|
|
489
|
|
8
|
5
|
|
|
5
|
|
4924
|
use Lingua::JA::Numbers; |
|
5
|
|
|
|
|
230053
|
|
|
5
|
|
|
|
|
844
|
|
9
|
5
|
|
|
5
|
|
5064
|
use Lingua::JA::Regular::Unicode qw/alnum_h2z/; |
|
5
|
|
|
|
|
66165
|
|
|
5
|
|
|
|
|
541
|
|
10
|
5
|
|
|
5
|
|
16499
|
use Number::Phone::JP::AreaCode::Data::Address2AreaCode; |
|
5
|
|
|
|
|
20
|
|
|
5
|
|
|
|
|
480
|
|
11
|
5
|
|
|
5
|
|
7529
|
use Number::Phone::JP::AreaCode::Data::AreaCode2Address; |
|
5
|
|
|
|
|
21
|
|
|
5
|
|
|
|
|
5566
|
|
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our $VERSION = "20131201.2"; |
14
|
|
|
|
|
|
|
our @EXPORT_OK = qw/ |
15
|
|
|
|
|
|
|
area_code_by_address |
16
|
|
|
|
|
|
|
area_code_by_address_prefix_match |
17
|
|
|
|
|
|
|
area_code_by_address_fuzzy |
18
|
|
|
|
|
|
|
address_by_area_code |
19
|
|
|
|
|
|
|
/; |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
sub area_code_by_address { |
22
|
9
|
|
|
9
|
1
|
32
|
my ($address) = @_; |
23
|
|
|
|
|
|
|
|
24
|
9
|
|
|
|
|
33
|
my ($prefecture, $town) = _separate_address($address); |
25
|
9
|
|
|
|
|
45
|
return get_address2areacode_map()->{$prefecture}->{$town}; |
26
|
|
|
|
|
|
|
} |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
sub area_code_by_address_prefix_match { |
29
|
9
|
|
|
9
|
1
|
29
|
my ($address) = @_; |
30
|
|
|
|
|
|
|
|
31
|
9
|
|
|
|
|
29
|
my ($prefecture, $town) = _separate_address($address); |
32
|
9
|
|
|
|
|
45
|
my $pref_map = get_address2areacode_map()->{$prefecture}; |
33
|
9
|
|
|
|
|
27
|
return _search_area_code_by_address_recursive($pref_map, $town); |
34
|
|
|
|
|
|
|
} |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
sub area_code_by_address_fuzzy { |
37
|
4
|
|
|
4
|
1
|
20
|
my ($address) = @_; |
38
|
|
|
|
|
|
|
|
39
|
4
|
|
|
|
|
22
|
my ($prefecture, $town) = _separate_address($address); |
40
|
4
|
|
|
|
|
24
|
my $pref_map = get_address2areacode_map()->{$prefecture}; |
41
|
|
|
|
|
|
|
|
42
|
4
|
100
|
|
|
|
37
|
if (exists $pref_map->{$town}) { |
43
|
1
|
|
|
|
|
15
|
return {"$prefecture$town" => $pref_map->{$town}}; |
44
|
|
|
|
|
|
|
} |
45
|
|
|
|
|
|
|
|
46
|
3
|
|
|
|
|
8
|
my $hits = {}; |
47
|
3
|
|
|
|
|
121
|
for my $key (keys %$pref_map) { |
48
|
453
|
100
|
100
|
|
|
5497
|
if ($town =~ $key || $key =~ $town) { |
49
|
5
|
|
|
|
|
27
|
$hits->{"$prefecture$key"} = $pref_map->{$key}; |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
} |
52
|
3
|
|
|
|
|
71
|
return $hits; |
53
|
|
|
|
|
|
|
} |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
sub address_by_area_code { |
56
|
5
|
|
|
5
|
1
|
17
|
my ($area_code) = @_; |
57
|
|
|
|
|
|
|
|
58
|
5
|
|
|
|
|
19
|
$area_code =~ s/\A0//; |
59
|
5
|
|
|
|
|
21
|
return get_areacode2address_map()->{$area_code}; |
60
|
|
|
|
|
|
|
} |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
sub _search_area_code_by_address_recursive { |
63
|
17
|
|
|
17
|
|
31
|
my ($pref_map, $town) = @_; |
64
|
|
|
|
|
|
|
|
65
|
17
|
100
|
|
|
|
59
|
if (exists $pref_map->{$town}) { |
66
|
8
|
|
|
|
|
124
|
return $pref_map->{$town}; |
67
|
|
|
|
|
|
|
} |
68
|
|
|
|
|
|
|
|
69
|
9
|
|
|
|
|
109
|
$town = _minimum_substitute_by_municipality($town); |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
# One character or less (e.g. "町") |
72
|
9
|
100
|
66
|
|
|
58
|
if (!$town || length $town <= 1) { |
73
|
1
|
|
|
|
|
10
|
return; |
74
|
|
|
|
|
|
|
} |
75
|
|
|
|
|
|
|
|
76
|
8
|
|
|
|
|
40
|
return _search_area_code_by_address_recursive($pref_map, $town); |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
sub _separate_address { |
80
|
22
|
|
|
22
|
|
45
|
my ($address) = @_; |
81
|
|
|
|
|
|
|
|
82
|
22
|
|
|
|
|
42
|
eval { $address = Encode::decode_utf8($address) }; # decode (but not twice) |
|
22
|
|
|
|
|
105
|
|
83
|
|
|
|
|
|
|
|
84
|
22
|
|
|
|
|
878
|
my ($prefecture, $town) = $address =~ /\A(京都府|東京都|大阪府|北海道|.+?県)(.*)/; |
85
|
22
|
|
|
|
|
77
|
$town =~ s/大字//g; # XXX ignore "大字" |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
# Support numerical number (hankaku / zenkaku) |
88
|
22
|
|
|
|
|
65
|
for my $num (0..9) { |
89
|
220
|
|
|
|
|
792
|
my $kanji_num = num2ja($num); |
90
|
220
|
|
|
|
|
18094
|
my $zenkaku_num = alnum_h2z($num); |
91
|
220
|
|
|
|
|
11418
|
$town =~ s/(:?$num|$zenkaku_num)/$kanji_num/g; |
92
|
|
|
|
|
|
|
} |
93
|
|
|
|
|
|
|
|
94
|
22
|
|
|
|
|
87
|
return ($prefecture, $town); |
95
|
|
|
|
|
|
|
} |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
sub _minimum_substitute_by_municipality { |
98
|
9
|
|
|
9
|
|
203
|
my ($town) = @_; |
99
|
|
|
|
|
|
|
|
100
|
9
|
|
|
|
|
15
|
my @substitutes; |
101
|
9
|
|
|
|
|
31
|
(my $block = $town) =~ s/区.*?\Z/区/; push @substitutes, $block; |
|
9
|
|
|
|
|
20
|
|
102
|
9
|
|
|
|
|
54
|
(my $city = $town) =~ s/市.*?\Z/市/; push @substitutes, $city; |
|
9
|
|
|
|
|
21
|
|
103
|
9
|
|
|
|
|
23
|
(my $group = $town) =~ s/郡.*?\Z/郡/; push @substitutes, $group; |
|
9
|
|
|
|
|
17
|
|
104
|
9
|
|
|
|
|
42
|
(my $cho = $town) =~ s/町.*?\Z/町/; push @substitutes, $cho; |
|
9
|
|
|
|
|
21
|
|
105
|
9
|
|
|
|
|
21
|
(my $village = $town) =~ s/村.*?\Z/村/; push @substitutes, $village; |
|
9
|
|
|
|
|
14
|
|
106
|
|
|
|
|
|
|
|
107
|
9
|
|
|
|
|
14
|
my $minimum_substituted = ''; |
108
|
9
|
|
|
|
|
19
|
for my $substituted (@substitutes) { |
109
|
45
|
100
|
|
|
|
102
|
next if $substituted eq $town; |
110
|
12
|
100
|
|
|
|
38
|
if (length $substituted > length $minimum_substituted) { |
111
|
11
|
|
|
|
|
24
|
$minimum_substituted = $substituted; |
112
|
|
|
|
|
|
|
} |
113
|
|
|
|
|
|
|
} |
114
|
|
|
|
|
|
|
|
115
|
9
|
|
|
|
|
37
|
return $minimum_substituted; |
116
|
|
|
|
|
|
|
} |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
1; |
119
|
|
|
|
|
|
|
__END__ |