use JSON; my $json = new JSON; my $unjson; my $statement_ok = eval { $unjson = $json->allow_nonref->decode($message); 1; }; if (! $statement_ok){ # $@ can be interpolated ;) warn "json decode error: $@\n"; } my $lat = $unjson->{"location"}{"lat"}; #### my $ok = eval { foo(); 1; }; if (! $ok){ if ($@ =~ /internal error/){ warn "foo() fsck'd up!\n"; } else { warn "foo() fsck'd up, with unexpected err: $@\n"; } }