line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Geography::Countries; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
771
|
use 5.006; |
|
1
|
|
|
|
|
4
|
|
|
1
|
|
|
|
|
42
|
|
4
|
|
|
|
|
|
|
|
5
|
1
|
|
|
1
|
|
6
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
34
|
|
6
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
1
|
|
|
|
|
14
|
|
|
1
|
|
|
|
|
35
|
|
7
|
1
|
|
|
1
|
|
4
|
no warnings 'syntax'; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
42
|
|
8
|
|
|
|
|
|
|
|
9
|
1
|
|
|
1
|
|
4
|
use Exporter (); |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
118
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
our @ISA = qw /Exporter/; |
12
|
|
|
|
|
|
|
our @EXPORT = qw /country/; |
13
|
|
|
|
|
|
|
our @EXPORT_OK = qw /code2 code3 numcode countries |
14
|
|
|
|
|
|
|
CNT_I_CODE2 CNT_I_CODE3 CNT_I_NUMCODE CNT_I_COUNTRY |
15
|
|
|
|
|
|
|
CNT_I_FLAG |
16
|
|
|
|
|
|
|
CNT_F_REGULAR CNT_F_OLD CNT_F_REGION CNT_F_ANY/; |
17
|
|
|
|
|
|
|
our %EXPORT_TAGS = (LISTS => [qw /code2 code3 numcode countries/], |
18
|
|
|
|
|
|
|
INDICES => [qw /CNT_I_CODE2 CNT_I_CODE3 CNT_I_NUMCODE |
19
|
|
|
|
|
|
|
CNT_I_COUNTRY CNT_I_FLAG/], |
20
|
|
|
|
|
|
|
FLAGS => [qw /CNT_F_REGULAR CNT_F_OLD |
21
|
|
|
|
|
|
|
CNT_F_REGION CNT_F_ANY/],); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
our $VERSION = '2009041301'; |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
|
26
|
1
|
|
|
1
|
|
4
|
use constant CNT_I_CODE2 => 0; |
|
1
|
|
|
|
|
6
|
|
|
1
|
|
|
|
|
83
|
|
27
|
1
|
|
|
1
|
|
4
|
use constant CNT_I_CODE3 => 1; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
55
|
|
28
|
1
|
|
|
1
|
|
5
|
use constant CNT_I_NUMCODE => 2; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
41
|
|
29
|
1
|
|
|
1
|
|
5
|
use constant CNT_I_COUNTRY => 3; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
47
|
|
30
|
1
|
|
|
1
|
|
4
|
use constant CNT_I_FLAG => 4; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
48
|
|
31
|
|
|
|
|
|
|
|
32
|
1
|
|
|
1
|
|
4
|
use constant CNT_F_REGULAR => 0x01; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
39
|
|
33
|
1
|
|
|
1
|
|
4
|
use constant CNT_F_OLD => 0x02; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
36
|
|
34
|
1
|
|
|
1
|
|
4
|
use constant CNT_F_REGION => 0x04; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
64
|
|
35
|
1
|
|
|
1
|
|
8
|
use constant CNT_F_ANY => CNT_F_REGULAR | CNT_F_OLD | CNT_F_REGION; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
1045
|
|
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
my (%info, @code2, @code3, @numcode, @countries); |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
sub norm ($) { |
40
|
761
|
|
|
761
|
0
|
801
|
my $query = shift; |
41
|
761
|
50
|
|
|
|
1106
|
die "Illegal argument to norm\n" unless defined $query; |
42
|
761
|
100
|
|
|
|
1637
|
return sprintf "%03d" => $query unless $query =~ /\D/; |
43
|
757
|
|
|
|
|
910
|
$query = lc $query; |
44
|
757
|
|
|
|
|
1111
|
$query =~ s/\s+//g; |
45
|
|
|
|
|
|
|
|
46
|
757
|
|
|
|
|
3793
|
$query; |
47
|
|
|
|
|
|
|
} |
48
|
|
|
|
|
|
|
|
49
|
1
|
|
|
1
|
|
1331
|
binmode (DATA, ':encoding(iso-8859-1)') if $] >= 5.008; |
|
1
|
|
|
|
|
13
|
|
|
1
|
|
|
|
|
6
|
|
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
my $flag; |
52
|
|
|
|
|
|
|
my %flags = ( |
53
|
|
|
|
|
|
|
Regular => CNT_F_REGULAR, |
54
|
|
|
|
|
|
|
Old => CNT_F_OLD, |
55
|
|
|
|
|
|
|
Region => CNT_F_REGION, |
56
|
|
|
|
|
|
|
); |
57
|
|
|
|
|
|
|
while () { |
58
|
|
|
|
|
|
|
chomp; |
59
|
|
|
|
|
|
|
last if $_ eq '__END__'; |
60
|
|
|
|
|
|
|
s/#.*//; |
61
|
|
|
|
|
|
|
next unless /\S/; |
62
|
|
|
|
|
|
|
if (/^%%\s*(\S.*\S)\s*%%$/) { |
63
|
|
|
|
|
|
|
$flag = $flags {$1} or |
64
|
|
|
|
|
|
|
die "Found illegal flag ``$1'' while parsing __DATA__\n"; |
65
|
|
|
|
|
|
|
next; |
66
|
|
|
|
|
|
|
} |
67
|
|
|
|
|
|
|
my $code2 = substr $_, 0, 2; $code2 = undef if $code2 =~ /\s/; |
68
|
|
|
|
|
|
|
my $code3 = substr $_, 3, 3; $code3 = undef if $code3 =~ /\s/; |
69
|
|
|
|
|
|
|
my $numcode = substr $_, 7, 3; $numcode = undef if $numcode =~ /\s/; |
70
|
|
|
|
|
|
|
my $country = substr $_, 11; |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
push @code2 => $code2 if defined $code2; |
73
|
|
|
|
|
|
|
push @code3 => $code3 if defined $code3; |
74
|
|
|
|
|
|
|
push @numcode => $numcode if defined $numcode; |
75
|
|
|
|
|
|
|
push @countries => $country; |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
my $info = [$code2, $code3, $numcode, $country, $flag]; |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
$info {norm $code2} = $info if defined $code2 ; |
80
|
|
|
|
|
|
|
$info {norm $code3} = $info if defined $code3 ; |
81
|
|
|
|
|
|
|
$info {$numcode} = $info if defined $numcode; |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
$info {norm $country} = $info; |
84
|
|
|
|
|
|
|
} |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
@code2 = sort @code2; |
87
|
|
|
|
|
|
|
@code3 = sort @code3; |
88
|
|
|
|
|
|
|
@numcode = sort @numcode; |
89
|
|
|
|
|
|
|
@countries = sort @countries; |
90
|
|
|
|
|
|
|
|
91
|
0
|
|
|
0
|
1
|
0
|
sub code2 {@code2} |
92
|
1
|
|
|
1
|
1
|
159
|
sub code3 {@code3} |
93
|
0
|
|
|
0
|
1
|
0
|
sub numcode {@numcode} |
94
|
0
|
|
|
0
|
1
|
0
|
sub countries {@countries} |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
sub country ($;$) { |
98
|
9
|
|
|
9
|
1
|
162
|
my $sub = (caller (0)) [3]; |
99
|
|
|
|
|
|
|
|
100
|
9
|
50
|
|
|
|
25
|
die "No arguments for $sub.\n" unless @_; |
101
|
9
|
100
|
|
|
|
26
|
die "Too many arguments for $sub.\n" unless @_ <= 2; |
102
|
|
|
|
|
|
|
|
103
|
8
|
|
|
|
|
17
|
my ($query, $flags) = @_; |
104
|
|
|
|
|
|
|
|
105
|
8
|
50
|
|
|
|
17
|
die "Undefined argument for $sub.\n" unless defined $query; |
106
|
|
|
|
|
|
|
|
107
|
8
|
|
100
|
|
|
27
|
$flags ||= CNT_F_REGULAR; |
108
|
|
|
|
|
|
|
|
109
|
8
|
100
|
|
|
|
29
|
die "Illegal second argument to $sub.\n" if $flags =~ /\D/; |
110
|
|
|
|
|
|
|
|
111
|
7
|
50
|
|
|
|
16
|
my $info = $info {norm $query} or return; |
112
|
|
|
|
|
|
|
|
113
|
7
|
100
|
|
|
|
25
|
return unless $info -> [CNT_I_FLAG] & $flags; |
114
|
|
|
|
|
|
|
|
115
|
6
|
100
|
|
|
|
29
|
wantarray ? @$info : $info -> [CNT_I_COUNTRY]; |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
1; |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
=pod |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
=head1 NAME |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
Geography::Countries - 2-letter, 3-letter, and numerical codes for countries. |
126
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
=head1 SYNOPSIS |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
use Geography::Countries; |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
$country = country 'DE'; # 'Germany' |
132
|
|
|
|
|
|
|
@list = country 666; # ('PM', 'SPM', 666, |
133
|
|
|
|
|
|
|
# 'Saint Pierre and Miquelon', 1) |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
=head1 DESCRIPTION |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
This module maps country names, and their 2-letter, 3-letter and |
138
|
|
|
|
|
|
|
numerical codes, as defined by the ISO-3166 maintenance agency [1], |
139
|
|
|
|
|
|
|
and defined by the UNSD. |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
=head2 The C subroutine. |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
This subroutine is exported by default. It takes a 2-letter, 3-letter or |
144
|
|
|
|
|
|
|
numerical code, or a country name as argument. In scalar context, it will |
145
|
|
|
|
|
|
|
return the country name, in list context, it will return a list consisting |
146
|
|
|
|
|
|
|
of the 2-letter code, the 3-letter code, the numerical code, the country |
147
|
|
|
|
|
|
|
name, and a flag, which is explained below. Note that not all countries |
148
|
|
|
|
|
|
|
have all 3 codes; if a code is unknown, the undefined value is returned. |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
There are 3 categories of countries. The largest category are the |
151
|
|
|
|
|
|
|
current countries. Then there is a small set of countries that no |
152
|
|
|
|
|
|
|
longer exist. The final set consists of areas consisting of multiple |
153
|
|
|
|
|
|
|
countries, like I. No 2-letter or 3-letter codes are available |
154
|
|
|
|
|
|
|
for the second two sets. (ISO 3166-3 [3] defines 4 letter codes for the |
155
|
|
|
|
|
|
|
set of countries that no longer exist, but the author of this module |
156
|
|
|
|
|
|
|
was unable to get her hands on that standard.) By default, C |
157
|
|
|
|
|
|
|
only returns countries from the first set, but this can be changed |
158
|
|
|
|
|
|
|
by giving C an optional second argument. |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
The module optionally exports the constants C, |
161
|
|
|
|
|
|
|
C, C and C. These constants can also |
162
|
|
|
|
|
|
|
be important all at once by using the tag C<:FLAGS>. C is just |
163
|
|
|
|
|
|
|
the binary or of the three other flags. The second argument of C |
164
|
|
|
|
|
|
|
should be the binary or of a subset of the flags C, |
165
|
|
|
|
|
|
|
C, and C - if no, or a false, second argument is |
166
|
|
|
|
|
|
|
given, C is assumed. If C is set, regular |
167
|
|
|
|
|
|
|
(current) countries will be returned; if C is set, old, |
168
|
|
|
|
|
|
|
no longer existing, countries will be returned, while C |
169
|
|
|
|
|
|
|
is used in case a region (not necessarely) a country might be returned. |
170
|
|
|
|
|
|
|
If C is used in list context, the fifth returned element is |
171
|
|
|
|
|
|
|
one of C, C and C, indicating |
172
|
|
|
|
|
|
|
whether the result is a regular country, an old country, or a region. |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
In list context, C returns a 5 element list. To avoid having |
175
|
|
|
|
|
|
|
to remember which element is in which index, the constants C, |
176
|
|
|
|
|
|
|
C, C, C and C |
177
|
|
|
|
|
|
|
can be imported. Those constants contain the indices of the 2-letter code, |
178
|
|
|
|
|
|
|
the 3-letter code, the numerical code, the country, and the flag explained |
179
|
|
|
|
|
|
|
above, respectively. All index constants can be imported by using the |
180
|
|
|
|
|
|
|
C<:INDICES> tag. |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=head2 The C, C, C and C routines. |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
All known 2-letter codes, 3-letter codes, numerical codes and country |
185
|
|
|
|
|
|
|
names can be returned by the routines C, C, C and |
186
|
|
|
|
|
|
|
C. None of these methods is exported by default; all need to |
187
|
|
|
|
|
|
|
be imported if one wants to use them. The tag C<:LISTS> imports them |
188
|
|
|
|
|
|
|
all. In scalar context, the number of known codes or countries is returned. |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
=head1 REFERENCES |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
The 2-letter codes come from the ISO 3166-1:1997 standard [2]. ISO 3166 |
193
|
|
|
|
|
|
|
bases its list of country names on the list of names published by |
194
|
|
|
|
|
|
|
the United Nations. This list is published by the Statistical Division |
195
|
|
|
|
|
|
|
of the United Nations [4]. The UNSD uses 3-letter codes, and numerical |
196
|
|
|
|
|
|
|
codes [5]. The information about old countries [6] and regions [7] also |
197
|
|
|
|
|
|
|
comes from the United Nations. |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
In a few cases, there was a conflict between the way how the United |
200
|
|
|
|
|
|
|
Nations spelled a name, and how ISO 3166 spells it. In most cases, |
201
|
|
|
|
|
|
|
is was word order (for instance whether I should |
202
|
|
|
|
|
|
|
preceed the name, or come after the name. A few cases had minor |
203
|
|
|
|
|
|
|
spelling variations. In all such cases, the method in which the UN |
204
|
|
|
|
|
|
|
spelled the name was choosen; ISO 3166 claims to take the names from |
205
|
|
|
|
|
|
|
the UN, so we consider the UN authoritative. |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
=over 4 |
208
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
=item [1] |
210
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
ISO Maintenance Agency (ISO 3166/MA) |
212
|
|
|
|
|
|
|
I. |
213
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
=item [2] |
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
I, |
217
|
|
|
|
|
|
|
I, |
218
|
|
|
|
|
|
|
7 September 1999. |
219
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
=item [3] |
221
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
ISO 3166-3, I. |
223
|
|
|
|
|
|
|
I. |
224
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
=item [4] |
226
|
|
|
|
|
|
|
|
227
|
|
|
|
|
|
|
United Nations, Statistics Division. |
228
|
|
|
|
|
|
|
I. |
229
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
=item [5] |
231
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
I. |
233
|
|
|
|
|
|
|
I, |
234
|
|
|
|
|
|
|
26 August 1999. |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
=item [6] |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
I. |
239
|
|
|
|
|
|
|
I, |
240
|
|
|
|
|
|
|
26 August 1999. |
241
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
=item [7] |
243
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
I. |
245
|
|
|
|
|
|
|
I, |
246
|
|
|
|
|
|
|
26 August 1999. |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
=back |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
=head1 BUGS |
251
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
Looking up information using country names is far from perfect. |
253
|
|
|
|
|
|
|
Except for case and the amount of white space, the exact name as it |
254
|
|
|
|
|
|
|
appears on the list has to be given. I will not return anything, |
255
|
|
|
|
|
|
|
but I will. |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
=head1 DEVELOPMENT |
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
The current sources of this module are found on github, |
260
|
|
|
|
|
|
|
L<< git://github.com/Abigail/geography--countries.git >>. |
261
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
=head1 AUTHOR |
263
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
Abigail L<< mailto:geography-countries@abigail.be >>. |
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
=head1 COPYRIGHT and LICENSE |
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
Copyright (C) 1999, 2009 by Abigail |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a |
271
|
|
|
|
|
|
|
copy of this software and associated documentation files (the "Software"), |
272
|
|
|
|
|
|
|
to deal in the Software without restriction, including without limitation |
273
|
|
|
|
|
|
|
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
274
|
|
|
|
|
|
|
and/or sell copies of the Software, and to permit persons to whom the |
275
|
|
|
|
|
|
|
Software is furnished to do so, subject to the following conditions: |
276
|
|
|
|
|
|
|
|
277
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included |
278
|
|
|
|
|
|
|
in all copies or substantial portions of the Software. |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
281
|
|
|
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
282
|
|
|
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
283
|
|
|
|
|
|
|
THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
284
|
|
|
|
|
|
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT |
285
|
|
|
|
|
|
|
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
286
|
|
|
|
|
|
|
THE SOFTWARE. |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
=cut |
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
__DATA__ |