Perl bounded worker pool over a queue

Perl
use strict;
use warnings;
use threads;
use Thread::Queue;

sub run_pool {
    my ($jobs, $workers, $fn) = @_;
    my $queue = Thread::Queue->new(@$jobs);
    $queue->end;
    my @threads = map { threads->create(sub {
        my @out;
        while (defined(my $job = $queue->dequeue)) {
            my $ok = eval { $fn->($job); 1 };
            push @out, { job => $job, ok => $ok ? 1 : 0, error => $ok ? undef : "$@" };
        }
        \@out;
    }) } 1 .. $workers;
    return map { @{ $_->join } } @threads;
}
my @res = run_pool([ 1 .. 6 ], 3, sub { $_[0] * 2 });
printf "%d jobs, %d ok\n", scalar @res, scalar grep { $_->{ok} } @res;