I offer the following as a balance of speed, elegance, and brevity, or at the very least, a demonstration of TMTOWTDI.
The algorithm is: take the first number off the top of the list, call it a prime, filter the rest of the list for multiples, repeat.
use strict;
sub primes {
my @n = (2..shift);
my @p;
while (@n && (push @p, shift @n)) {
@n = grep { $_ % $p[-1] } @n;
}
return @p
}
# find all primes through 100
print join ',',primes(100);
Note: the grep is fairly costly. Find a better algorithm if you're looking for all primes up to, say, 100,000.