sub try_again { my $msg = shift; log($msg); # ..do more stuff.. return 1 if $ok; return; # would be double return } sub go { do_it() or try_again("It didn't work") or return; ... } go(); #### # no return in the outer sub sub go { do_it or try_again; ... }