ETOOBUSY 🚀 minimal blogging for the impatient
Algorithm::Loops
TL;DR
NestedLoops
from Algorithm::Loops can come handy. Other functions can too.
In a little side project I ended up with some four or five nested
loops and to be honest it seemed a tad too many. Then I remembered about
this neat module Algorithm::Loops and in particular the
NestedLoops
function, that aims at solving exactly that problem.
In my case I just needed to generate the cartesian product of a few input arrays - i.e. I needed all the possible arrangements taking one item from each array. Hence, it can be as simple as this:
use Algorithm::Loops 'NestedLoops';
my @dimensions = (
['A' .. 'F'], # first slot has some uppercase letters
[ 2, 3, 5, 7 ], # then some digits
[ qw< foo bar baz > ], # thsn some words
);
NestedLoops(\@dimensions, sub { print join('-', @_), "\n" });
which, as you can correctly guess, prints out $6 \cdot 4 \cdot 3 = 72$ items out:
$ perl test.pl | nl
1 A-2-foo
2 A-2-bar
...
71 F-7-bar
72 F-7-baz
There are other subtler ways to generate and manage smarter loops… you can get them in the docs, as well as other functions, like:
- the
MapCar
* family (to iterate over multiple arrays, in parallel) NextPermute
andNextPermuteNum
, which provide iterators to go through all or part of the permutations in a list of elements.
Filter
is probably no more needed nowadays after the r
non-destructive substitution modifier was added to the s
and
tr
/y
operators in 2011.