in reply to How to make Geo::Coder::Google run even if input location doesn't exist

Maybe you could think about what happens when the eval traps the error. What should the value of $response be if there was an error?

  • Comment on Re: How to make Geo::Coder::Google run even if input location doesn't exist
  • Download Code

Replies are listed 'Best First'.
Re^2: How to make Geo::Coder::Google run even if input location doesn't exist
by M15U (Acolyte) on Mar 01, 2013 at 08:19 UTC

    $response is a hash reference in this case, and when I it encounters an unknown location like "CorseMétéo", it gives the following error message : "Use of uninitialized value $response in concatenation (.) or string at geoTest.pl line 25."

    I'm pretty new to perl so I'm not good at error managment

      Maybe $response is something else in the case of error?

      I believe that eval shows the use of the $@ variable to detect whether an error happened within the block. Maybe you can use that to detect whether there was an error.

      Alternatively, consider checking the value of $response - if it is not a true value, it can't be a hash reference:

      ... if( !$response ) { warn "Uhoh - we didn't get a response."; };

        Still when using "eval" and "$@" I get: "Can't use an undefined value as an ARRAY reference at geoTest.pl line 32." I suppose this refers to " @{ $response->{Point}{coordinates} }". The code looks like this:

        #!/usr/bin/perl -w use strict; use locale; use warnings; #use diagnostics; use utf8; binmode(STDIN, "encoding(utf8)"); binmode(STDOUT, "encoding(utf8)"); binmode(STDERR, "encoding(utf8)"); use Geo::Coder::Google; my @place = ('Seattle', 'France', 'CorseMétéo', 'New Delhi'); my ($long, $lat); foreach my $place(@place){ my $geocoder = Geo::Coder::Google->new(apikey => '{MyAPIkeyHere}') +; my $response; until (defined $@ || defined $response){ eval{ $response = $geocoder->geocode(location => $place); } } if ($@){ print "Couldn't get location\n"; } ($long, $lat) = @{ $response->{Point}{coordinates} }; print "$long\n"; print "$lat\n"; }