http://qs321.pair.com?node_id=1064678


in reply to Re^2: Variable number of foreach loops
in thread Variable number of foreach loops

BTW what is the third argument($i) nFor( $n-1, @_, $i ) doing here?

As the sub recurses, one of the array references is remove from the front of @_ at each level, and the current value being iterated by the for loop at that level is added to the end.

Once $n == 0, all the array references have been removed and $n has been shifted off, all that is left in @_, is the set of elements to be printed.

BTW. Here is a cleaner implementation that takes a callback to which the results sets are passed:

#! perl -slw use strict; sub nForX(&@) { my $code = shift; my $n = shift; return $code->( @_ ) unless $n; for my $i ( @{ shift() } ) { &nForX( $code, $n-1, @_, $i ); } } my @a = 1..10; my @b = 'a'..'z'; my @c = map chr, 33 .. 47; nForX { print join ' ', @_; } 3, \( @a, @b, @c );

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^4: Variable number of foreach loops
by abhay180 (Sexton) on Nov 28, 2013 at 05:09 UTC
    thanks a lot. yes i get it now. In the same light.....i want to call nfor() with different number of arguments...
    nfor(1,\@a_1); nfor(2,\@a_1,\@a_2); nfor(3,\@a_1,\@a_2,\@a_3);...so on nfor(N,\@a_1,\@a_2,...\@a_N).
    I have a way...but what to check if there is a much crispier way to do it.

      If you store your arrays (more specifically references to your arrays) in an array, you can say

      my @arrayOfArrays = ( \@a_1,\@a_2,...,\@a_20 ); my $n = 10; nfor( $n, @arrayOfArrays[ 0..$n-1 ] );

      Where will you get the variable number of arrays from? And how will you be storing them?


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        I have stored my data in N arrays. N varies from 1..20 I have a random string, that i breakdown into some N-segments. Each Segment is then a array. Now i want to run nfor() on these. So as you can see segment size is random. Hence variable number of arrays.