Perl capped exponential backoff with jitter

Perl
use strict;
use warnings;
use Time::HiRes qw(sleep);

sub retry {
    my ($attempts, $code, %opt) = @_;
    my ($base, $cap) = ($opt{base} // 0.1, $opt{cap} // 5);
    for my $try (1 .. $attempts) {
        my @out = eval { $code->($try) };
        return wantarray ? @out : $out[0] if !$@;
        die $@ if $try == $attempts;
        my $delay = $base * 2 ** ($try - 1);
        $delay = $cap if $delay > $cap;
        sleep($delay * (0.5 + rand(0.5)));
    }
}

my $n = retry(4, sub { die "flaky\n" if rand() < 0.7; return "ok" });
print "$n\n";