sub abstract_loop($$$) { my ($N, $plevel, $pvals) = @_; foreach (@list) { push @$pvals, $_; arbitrary_N_loops($N, $plevel, $pvals); pop @$pvals; } } sub arbitrary_N_loops($;$$) { my ($N, $plevel, $pvals) = @_; # Check level my $level = (!defined($plevel))? 1: $$plevel + 1; # Initialization (Called once at the beginning of all loops) if (1 == $level) { $pvals = [ ]; $nmatch = $total = 0; } # Call loop N times if ($level <= $N) { &abstract_loop($N, \$level, $pvals); } else { # This block only happens within the innermost loop match($pvals) and ++$nmatch; ++$total; } # Finalization (Called once at the end of all loops) if (0 == --$level) { show_results($N, $nmatch, $total); } } arbitrary_N_loops(1); arbitrary_N_loops(2); arbitrary_N_loops(3); arbitrary_N_loops(4); arbitrary_N_loops(5); arbitrary_N_loops(6); arbitrary_N_loops(7); arbitrary_N_loops(8);