in reply to Re^2: 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

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

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

    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 }

        It seem to work now... It get's coordinates even for the unexisting location like 'CorseMétéo'. However it still gives an error : "Useless use of string in void context at geoTest.pl line 27.". The code :

        #!/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 $response){ eval{ $response = $geocoder->geocode(location => $place); if ($@){ "Couldn't get location : $place\n"; }else{ ($long, $lat) = @{ $response->{Point}{coordinates} }; } } } print "$place\n"; print "$long\n"; print "$lat\n"; }

        Do you think it's a problem if I use the code even if it gives an error bu it works?