Google имеет геокодирование API, который, кажется, работает вполне прилично на большинство местоположений, для которых у них есть данные Google Maps.
http://googlemapsapi.blogspot.com/2006/06/geocoding-at-last.html
Они обеспечивают онлайн геокодирование (через JavaScript):
http://code.google.com/apis/maps/documentation/services.html#Geocoding
Или геокодирование бэкенда (с помощью Запроса HTTP):
http://code.google.com/apis/maps/documentation/services.html#Geocoding_Direct
данные обычно являются тем же, используемым самой Google Maps. (обратите внимание, что существуют некоторые исключения к этому, такие как Великобритания или Израиль, где данные из другого источника и немного уменьшенного качества)
Лучший подход зависит от ваших целей. Пункт FAQ, упомянутый Синаном, является хорошим ресурсом: Как мне проверить, равны ли два массива или хэши? . Во время разработки и отладки (и, конечно же, при написании модульных тестов) я обнаружил, что Test :: More
полезен при сравнении массивов, хэшей и сложных структур данных. Простой пример:
use strict;
use warnings;
my %some_data = (
a => [1, 2, 'x'],
b => { foo => 'bar', biz => 'buz' },
j => '867-5309',
);
my %other_data = (
a => [1, 2, 'x'],
b => { foo => 'bar', biz => 'buz' },
j => '867-5309x',
);
use Test::More tests => 1;
is_deeply(\%other_data, \%some_data, 'data structures should be the same');
Вывод:
1..1
not ok 1 - data structures should be the same
# Failed test 'data structures should be the same'
# at _x.pl line 19.
# Structures begin differing at:
# $got->{j} = '867-5309x'
# $expected->{j} = '867-5309'
# Looks like you failed 1 test of 1.
Сравнить - это недостаточно подробная фраза, когда речь идет о хэшах. Есть много способов сравнить хеши:
У них одинаковое количество ключей?
if (%a == %b) {
print "they have the same number of keys\n";
} else {
print "they don't have the same number of keys\n";
}
Одинаковы ли ключи в обоих хэшах?
if (%a != %b) {
print "they don't have the same number of keys\n";
} else {
my %cmp = map { $_ => 1 } keys %a;
for my $key (keys %b) {
last unless exists $cmp{$key};
delete $cmp{$key};
}
if (%cmp) {
print "they don't have the same keys\n";
} else {
print "they have the same keys\n";
}
}
У них одинаковые ключи и одинаковые значения в обоих хэшах?
if (%a != %b) {
print "they don't have the same number of keys\n";
} else {
my %cmp = map { $_ => 1 } keys %a;
for my $key (keys %b) {
last unless exists $cmp{$key};
last unless $a{$key} eq $b{$key};
delete $cmp{$key};
}
if (%cmp) {
print "they don't have the same keys or values\n";
} else {
print "they have the same keys or values\n";
}
}
Изоморфны ли они (я оставлю это на усмотрение читателя, поскольку я не особо хочу пытаться реализовать его с нуля)?
Или какой-то другой критерий равенства?
И, конечно же, этот код работает только с простыми хешами. Добавление сложных структур данных делает его еще более сложным.
См. Как проверить, равны ли два массива или хэши?
Часто задаваемые вопросы и ответы Perl являются частью вашего дистрибутива Perl. Вы можете просмотреть версию этого ответа, которая пришла с вашим perl
, запустив:
$ perldoc -q equal
в вашем терминале.
Быстро, грязно и, я уверен, не настолько эффективно:
use strict;
use warnings;
use Data::Dumper;
sub compare ($$) {
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Indent = 0;
Dumper(shift) eq Dumper(shift);
}
my %a = ( foo => 'bar', bar => [ 0 .. 3 ] );
my %b = ( foo => 'bar', bar => [ 0 .. 3 ] );
my %c = ( foo => 'bar', bar => [ 0 .. 4 ] );
print Dumper compare \%a, \%b;
print Dumper compare \%a, \%c;