Hack #90. Glob Those Sequences
Don't settle for counting from one to n by one.
Perl has a syntax for generating simple sequences of increasing integers:
@count_up = 0..100;
There's no syntax for anything more interesting, such as counting by twos or counting down—unless you create one yourself.
The Hack
The angle brackets in Perl have two distinct purposes: as a shorthand for calling readline, and as a shorthand for calling glob:
my $input = <$fh>; # shorthand for: readline($fh)
my @files = <*.pl>; # shorthand for: glob("*.pl")Assuming you're not interested in that second rather specialized usage (and you can always use the standard
File::Glob module, if you are), you can hijack non-readline angles for something much tastier: list comprehensions.
Tip
A list comprehension is an expression that filters and transforms one list to create another, more interesting, list. Of course, Perl already has map and grep to do that:
@prime_countdown = grep { is_prime($_) } map { 100-$_ } 0..99;but doesn't have a dedicated (and optimized) syntax for it:
@prime_countdown = <100..1 : is_prime(X)>;
Running the Hack
By replacing the
CORE::GLOBAL::glob( ) subroutine, you replace both the builtin glob( ) function and the angle-bracketed operator version. By rewriting CORE::GLOBAL::glob( ), you can retarget the <...> syntax to do whatever you like, for example, to build sophisticated lists.
Do so with:
package Glob::Lists; use Carp; # Regexes to parse the extended list specifications... my $NUM = qr{\\s* [+-]? ...