JSON使用Perl循环访问Google地理编码address_components

时间:2013-02-10 00:23:07

标签: json perl google-maps google-geocoder

我编写了一个脚本,使用perl和json从谷歌地理编码器中获取一些信息。下面的示例使用机场缩写来获取地址信息。

use JSON;
use LWP::Simple;

my $geo_url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=PHL";

my $response = get($geo_url);
my $json = decode_json($response);

my $location = $json->{results}[0]->{geometry}->{location};
my $address  = $json->{results}[0]->{formatted_address};

print "<br />Latitude: ".$location->{lat}." Longiude: ".$location->{lng};
print "<br />Address: ".$address;

我可以使用:

获取address_component数组的各个部分
$json->{results}[0]{address_components}[0]->{short_name};
$json->{results}[0]{address_components}[1]->{short_name};

但我真正想做的是获取city,state和zip(postal_code)。要做到这一点,我需要循环遍历address_components并运行如下:

for (keys $json->{results}[0]{address_components}) {
  if ($json->{results}[0]{address_components}[$i]->types[0] eq "postal_code") {
    print "Zip: ".$json->{results}[0]{address_components}[$i]->{short_name};
    }
  }

显然这不是有效的代码,但我想解释一下我要做的事情。这是我无法工作的循环。我已经尝试了很多配置,即使数组项长度为6,我也会继续获得1的数组长度。

1 个答案:

答案 0 :(得分:1)

基于

$json->{results}[0]{address_components}[0]->{shortname};
$json->{results}[0]{address_components}[1]->{shortname};

$json->{results}[0]{address_components}包含对数组的引用。虽然技术上可以在数组引用上调用keys来获取最近版本的Perl中的索引列表,但在这种情况下获取数组元素的列表更简单(以及大多数其他情况)。

for my $address_component (@{ $json->{results}[0]{address_components} }) {
    if ( $address_component->{types}[0] eq "postal_code") {
       print "Zip: $address_component->{shortname}\n";
    }
}

可能会更好地查看所有类型。

for my $address_component (@{ $json->{results}[0]{address_components} }) {
    if (grep { $_ eq "postal_code" } @{ $address_component->{types} }) {
       print "Zip: $address_component->{shortname}\n";
    }
}