0

このデータダンプの構造を想定しGeo::Coder::Googleます --- dd $location;

  address_components => [
    {
      long_name => "Blackheath Avenue",
      short_name => "Blackheath Ave",
      types => ["route"],
    },
    {
      long_name => "Greater London",
      short_name => "Gt Lon",
      types => ["administrative_area_level_2", "political"],
    },
    {
      long_name => "United Kingdom",
      short_name => "GB",
      types => ["country", "political"],
    },
    {
      long_name => "SE10 8XJ",
      short_name => "SE10 8XJ",
      types => ["postal_code"],
    },
    { long_name => "London", short_name => "London", types => ["postal_town"] },
  ],
  formatted_address => "Blackheath Avenue, London SE10 8XJ, UK",
  geometry => {
    bounds        => {
      northeast => { lat => 51.4770228, lng => 0.0005404 },
      southwest => { lat => 51.4762273, lng => -0.0001147 },
    },
    location      => { lat => 51.4766277, lng => 0.0002212 },
    location_type => "APPROXIMATE",
    viewport      => {
      northeast => { lat => 51.4779740302915, lng => 0.00156183029150203 },
      southwest => { lat => 51.4752760697085, lng => -0.00113613029150203 },
    },
  },
  types => ["route"],
}

呼び出しの例:

my $long_name = &get_field_for_location("long_name", $location);

次のサブルーチンは最初のものを返しますlong_name(この例では --- type=route):

sub get_field_for_location($$) {
  my $field    = shift;
  my $location = shift;

  my $address = $location->{address_components};
  return $_->{$field} for @$address;
}

別のタイプのにアクセスするlong_nameには? つまり、このサブルーチンを変更し$fieldて、特定のタイプのエントリにアクセスするにはどうすればよいでしょうか?

4

2 に答える 2

3

types文字列の配列への参照です。それらのいずれかが必要なタイプに一致するかどうかを確認する必要があります。次を使用してこれを行うことができますList::Util::first

use List::Util qw(first);

sub get_field_for_location {
    my $field = shift;
    my $location = shift;
    my $type = shift;

    my $address = $location->{'address_components'};
    for my $component (@{$address}) {
        if (first { $_ eq $type } @{$component->{'types'}}) {
            return $component->{$field};
        }
    }
}
于 2013-10-24T16:07:26.127 に答える
2

politicalタイプの最初に、 を返す必要があります。

my $type = "political";

my ($first_of_type) =  grep { 
  grep { $_ eq $type } @{$_->{types}}; 
} @$address;

return $first_of_type->{$field};

配列の外側grepのフィルタ要素@$address、および の内側のgrepフィルタ要素types、すなわち。["administrative_area_level_2", "political"]

于 2013-10-24T16:02:41.757 に答える