通过Google geocode的JSON循环使用Perl地址_组件

通过Google geocode的JSON循环使用Perl地址_组件,json,perl,google-maps,google-geocoder,Json,Perl,Google Maps,Google Geocoder,我编写了一个脚本,使用perl和json从google geocoder获取一些信息。下面的示例使用机场缩写获取地址信息 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

我编写了一个脚本,使用perl和json从google geocoder获取一些信息。下面的示例使用机场缩写获取地址信息

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_组件并运行如下操作:

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的数组长度。

基于

$json->{results}[0]{address_components}[0]->{shortname};
$json->{results}[0]{address_components}[1]->{shortname};
$json->{results}[0]{address\u components}
保存对数组的引用。在最新版本的Perl中,从技术上讲,可以对数组引用调用
,以获取索引列表,但在这种情况下(以及大多数其他情况下),只需获取数组元素列表就更简单了

最好查看所有类型

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

谢谢,这很好。如果有人想使用此解决方案,您可能需要将shortname更改为short_name,以便与Google geocoder输出兼容。这是我在最初问题中的错误。
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";
    }
}