sub mk_less_than_filter { my $limit = shift; return sub { my $elt = shift; return $elt < $limit; }; } sub find_less_than { my $limit = shift; my $vals = shift; my $filter = mk_less_than_filter($limit); return grep {$filter->($_)} @$vals; } print join(", ", find_less_than(4, [1, 2, 7, 10, 3, 8])), "\n"; # Prints 1, 2, 3