in reply to Re: Iterator Problem with recursion
in thread Iterator Problem with recursion

You've hit the nail on the head.

From the perlfunc documentation for each:

There is a single iterator for each hash, shared by all each, keys, and values function calls in the program

Replies are listed 'Best First'.
Re^3: Iterator Problem with recursion
by PetaMem (Priest) on Apr 26, 2005 at 17:26 UTC
    Hi,

    well - I know of this restriction, and it may do bite me here sometime later. But I do not see how the each iterator, bound to %$rul should clash with the iteration of for(@out).

    Bye
     PetaMem
        All Perl:   MT, NLP, NLU

      Fletch and splinky are right. Try this toy example and you will see it clearly:

      use strict; use warnings; my $count = 0; my $max_output = 7; sub rec { my $hash = shift; my $level = shift; return if $level > 1; while ( my ( $k, $v ) = each %$hash ) { exit 0 if ++$count > $max_output; # backstop print "$level: $k\n"; rec( $hash, $level + 1 ); } } rec( { foo => 1, bar => 2, baz => 3 }, 0 ); __END__ 0: bar 1: baz 1: foo 0: bar 1: baz 1: foo 0: bar
      Notice how, when the recursion level is 1, the iterator doesn't visit 'bar' (because it was already visited at level 0). Instead, it visits the remaining keys (thereby exhausting each), and returns (since in this case, all further recursion stops at level 2). Once level 1 returns control to level 0, each starts again from the top.

      the lowliest monk

        I know and agree, but as I mentioned, the each loop is not the problem here, but actually our case is something along the lines of
        sub rec { my $hash = shift; my $level = shift; return if $level > 1; while ( my ( $k, $v ) = each %$hash ) { exit 0 if ++$count > 10; print "$level: $k => $v\n"; for (1..3) { rec( $hash, $level + 1 ); print "$_\n"; } } }
        where the for(1..3) loop is not stepped through, but stuck. In this code, wading through the loop works.

        Bye
         PetaMem
            All Perl:   MT, NLP, NLU