return join " ", grep {$_ <= $n} @primes;
This use of grep will iterate over the entire list of @primes even after the $n limit is encountered. This is not a problem for a list of the first fifteen primes, but might be for the first 15 million primes! One way to mitigate this overhead would be with the List::MoreUtils::last_index() function:
c:\@Work\Perl\monks>perl -le
"use warnings;
use strict;
;;
use List::MoreUtils qw(last_index);
;;
my @primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47)
+;
print qq{primes: @primes};
;;
sub listprimes {
my ($n) = @_;
;;
my $last_i = last_index { $_ <= $n } @primes;
;;
return join ' ', @primes[ 0 .. $last_i ];
}
;;
sub random {
my ($lo, $hi) = @_;
return $lo + int rand $hi - $lo + 1;
}
;;
for (1 .. 5) {
my $r = random(10, 50);
my $f = listprimes($r);
print qq{r == $r: $f};
}
"
primes: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
r == 50: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
r == 32: 2 3 5 7 11 13 17 19 23 29 31
r == 18: 2 3 5 7 11 13 17
r == 47: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
r == 25: 2 3 5 7 11 13 17 19 23
Give a man a fish: <%-{-{-{-<
|