in reply to goto &sub up the stack

The easiest thing to do is to have &get_info return undef on failure. Then you can check to see if you have good $info back, in &do_something. If not, then recall &get_info with another arg to see if that works. You don't really need to get too complicated with this.

sub do_something { my $param = shift; # just add a test for success here: my $info = get_info($param) || get_info('option 1'); # more things happen do_something_else($param, $info); } sub get_info { my $param = shift; my $info; if($param eq 'option 1') { $info = 'blah'; } elsif($param eq 'option 2') { return unless # <-- test whether a failure occurred; return undef do_something_that_might_fail($param) #POINT A $info = 'foo'; } else { $info = 'bar'' } return $info; }
I hope that's clear.

I'm not sure HOW the failure occurs. Maybe by dying, maybe by returning false from &do_something_that_might_fail ... I chose the latter for this example. Please put in a test that works for you.