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* [+-]? ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access