#! perl -slw
use strict;
use Algorithm::Loops qw( NestedLoops );
sub nFor(&@) {
my $cb = shift;
NestedLoops([ map [ 0..$_-1 ], @_ ], $cb);
}
my @digits = 1 .. 3;
nFor {
print join '', @digits[ @_ ];
} ( 3 ) x 4;
####
apple, dog, 1
apple, dog, 2
apple, dog, III
apple, cat, 1
apple, cat, 2
apple, cat, III
apple, platypus, 1
apple, platypus, 2
apple, platypus, III
orange, dog, 1
orange, dog, 2
orange, dog, III
orange, cat, 1
orange, cat, 2
orange, cat, III
orange, platypus, 1
orange, platypus, 2
orange, platypus, III
tomato, dog, 1
tomato, dog, 2
tomato, dog, III
tomato, cat, 1
tomato, cat, 2
tomato, cat, III
tomato, platypus, 1
tomato, platypus, 2
tomato, platypus, III
####
# Variable number of lists of variable length
my @lists = (
[qw( apple orange tomato )],
[qw( dog cat platypus )],
[qw( 1 2 III )],
);
####
local $, = ", ";
local $\ = "\n";
NestedLoops(\@lists, sub { print @_ });
####
local $, = ", ";
local $\ = "\n";
nFor { print map $lists[$_][ $_[$_] ], 0..$#_; } map 0+@$_, @lists;
####
sub nested(&@) {
my $cb = shift;
NestedLoops(\@_, $cb);
}
local $, = ", ";
local $\ = "\n";
nested { print @_; } @lists;