Sounds like a challenge. I took the dj_string routine on rosettacode and simplified it some.
sub sieve_s2 {
my ($n, $i, $s, $d, @primes) = (shift, 7);
my $sieve = '110010101110101110101110111110' .
'101111101110101110101110111110' x ($n/30);
for ($sieve) {
until (($s = $i*$i) > $n) {
$d = 2*$i;
do { substr($_, $s, 1, '1') } until ($s += $d) > $n;
1 while substr($_, $i += 2, 1);
}
$_ = substr($_, 1, $n);
push @primes, pos while m/0/gogo;
return @primes;
}
}
Pure perl isn't up to warp-speed, understandably.