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* ...
Get Perl Hacks now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.