Получение данных из хеш-структуры Perl? - PullRequest
2 голосов
/ 16 сентября 2011

Я пытаюсь изменить существующий скрипт на Perl для поддержки геокодирования. Нашел этот модуль для него: http://metacpan.org/pod/Geo::Coder::Google

Я просто не могу понять, как извлечь данные из возвращаемой хеш-структуры (я не Perl-кодер, это просто какой-то устаревший скрипт, который мне нужно исправить).

       {
        'AddressDetails' => {
          'Country' => {
            'AdministrativeArea' => {
              'SubAdministrativeArea' => {
                'SubAdministrativeAreaName' => 'San Francisco',
                'Locality' => {
                  'PostalCode' => {
                    'PostalCodeNumber' => '94107'
                  },
                  'LocalityName' => 'San Francisco',
                  'Thoroughfare' => {
                    'ThoroughfareName' => '548 4th St'
                  }
                }
              },
              'AdministrativeAreaName' => 'CA'
            },
            'CountryNameCode' => 'US'
          }
        },
        'address' => '548 4th St, San Francisco, CA 94107, USA',
        'Point' => {
          'coordinates' => [
            '-122.397323',
            '37.778993',
            0
          ]
        }
      }

Перепробовал все учебники по хешу, которые я уже нашел в Google, максимум, что я могу заставить его напечатать, это что-то вроде HASH (0x91e5558). Пока мой код - это то, что модуль показывает в качестве примера:

use Geo::Coder::Google;
my $geocoder = Geo::Coder::Google->new(apikey => 'Your API Key');
my $location = $geocoder->geocode( location => 'Hollywood and Highland, Los Angeles, CA'); 

Я бы просто хотел, чтобы точка -> координировала данные с собственными переменными, которые я затем могла бы записать в базу данных.

Ответы [ 3 ]

5 голосов
/ 16 сентября 2011

Это то, что вы хотите?

$lon = $location->{Point}{coordinates}[0];
$lat = $location->{Point}{coordinates}[1];
2 голосов
/ 16 сентября 2011

Я просто хотел представить более простую кодовую версию этого.Так как Tatsuhiko не предоставил его, я хотел показать, что можно

  • благословлять структуры данных, созданные в других местах, и задавать поведение структурам данных.
  • вставлять методы в класс (пакет)

Итак, вот определение пакета.

package Geo::Coder::Google::Geocode;
use strict;
use warnings;
use Carp         qw<croak>;
use Params::Util qw<_ARRAY _CLASS _CLASSISA _HASH _INSTANCE>;

sub new { 
    croak( 'Not a valid subclass' )
        unless my $class  = _SUBCLASS( _CLASS( $_[0] ), __PACKAGE__ )
        ;
    croak( 'Not a valid structure!' )
        unless my $struct = _HASH( $_[1] ) 
           and _HASH( $_[0]->{Point} )
        ;
    # Done with checks, just bless it
    return bless( $struct, $class );
}

sub coordinates {

    my ( $self, $point, $coords ) = shift;
    # Make sure each link in the chain exists ( and is populated ).
    return unless _INSTANCE( $self, __PACKAGE__ )
              and $point  = _HASH( $self->{Point} )
              and $coords = _ARRAY( $point->{coordinates} )
              ;
    We have an array ref here, return it.
    return wantarray ? @$coords : $coords;
}

{ package Geo::Coder::Google;
    use Carp         qw<croak>;
    use Params::Util qw<_HASH>;
    sub get_geocode {
        croak( 'Geocode not created!' ) unless my $gcode = _HASH( &geocode );
        return Geo::Coder::Google::Geocode->new( $gcode );
    }
}

Затем вы можете использовать его следующим образом:

my ( $lat, $long )
    = $geocoder->get_geocode( 
       location => 'Hollywood and Highland, Los Angeles, CA'
     )->coordinates
     ;

Это создает быструю инкапсуляцию для созданияэто облегчает кодирование доступа в будущем, а также обеспечивает простые изменения в использовании кода.

Вы также можете добавить эту функцию:

{ package Geo::Coder::Google;
    use Carp         qw<croak>;
    use Params::Util qw<_HASH>;
    sub get_coordinates {
        croak( 'Geocode not created!' ) unless my $gcode = _HASH( &geocode );
        return Geo::Coder::Google::Geocode->new( $gcode )->coordinates;
    }
}

И затем вызвать:

my ( $lat, $long ) 
    = $geocoder->get_coordinates( location => 'Hollywood and Highland, Los Angeles, CA' )
    ;
0 голосов
/ 16 сентября 2011

Вы ищете что-то вроде этого:

$hashref = {
    'a' => 'A',
    'b' => {
        'c' => 'C',
        'some' => 'value',
    },
};

print "$hashref->{b}{some}\n"; # output: value
...