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

$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

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

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

    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"; }

        Maybe you shouldn't try to get longitude and latitude when you already know that you didn't get a valid response?

        I recommend the following structure:

        if ($@){ print "Couldn't get location\n"; } else { ... retrieve and print longitude, latitude }