Как делают я сравниваю два хеша в Perl, не используя Данные:: Выдержать сравнение?

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. (обратите внимание, что существуют некоторые исключения к этому, такие как Великобритания или Израиль, где данные из другого источника и немного уменьшенного качества)

13
задан brian d foy 14 August 2009 в 11:51
поделиться

4 ответа

Лучший подход зависит от ваших целей. Пункт 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.
22
ответ дан 1 December 2019 в 19:02
поделиться

Сравнить - это недостаточно подробная фраза, когда речь идет о хэшах. Есть много способов сравнить хеши:

У них одинаковое количество ключей?

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";
    }
}

Изоморфны ли они (я оставлю это на усмотрение читателя, поскольку я не особо хочу пытаться реализовать его с нуля)?

Или какой-то другой критерий равенства?

И, конечно же, этот код работает только с простыми хешами. Добавление сложных структур данных делает его еще более сложным.

10
ответ дан 1 December 2019 в 19:02
поделиться

См. Как проверить, равны ли два массива или хэши?

Часто задаваемые вопросы и ответы Perl являются частью вашего дистрибутива Perl. Вы можете просмотреть версию этого ответа, которая пришла с вашим perl , запустив:

$ perldoc -q equal

в вашем терминале.

3
ответ дан 1 December 2019 в 19:02
поделиться

Быстро, грязно и, я уверен, не настолько эффективно:

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;
2
ответ дан 1 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: