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.
| [reply] [d/l] |
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.
| [reply] [d/l] |