sub retry(&$) { my $sub_ref = shift; my $max = shift ||3; ATTEMPT: for my $try (1..$max) { eval { $sub_ref->(); }; last unless $@; warn "Failed $try, retrying. Error: $@\n" } if ($@) { die "failed after $max tries: $@\n" } } my $t=0; retry { print "Seeya!" and last ATTEMPT if $t++>4; die "failure"; } 10;