in reply to Iterator Problem with recursion

Not completely sure, but the fact that you're calling each on the same underlying hashref in the different scopes might be doing bad things. At least it's rasing hackles when I look at it.

Replies are listed 'Best First'.
Re^2: Iterator Problem with recursion
by splinky (Hermit) on Apr 26, 2005 at 17:15 UTC
    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

      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