The above will work nicely so long as you are certain there are no circularities in your nested hash. If there are you will get an infinite loop. To fix this you'll need to do two things:

A small addition to the above code will eliminate the problem of circularities

# %nested_hash revised to contain a circularity my $hAA = {aaa => 1, aab => 2 }; $hAA->{aac} = $hAA; my %nested_hash = ( a => { aa => $hAA, ab => {aba => 4, abb => 5, abc => 6} }, b => { ba => {baa => 7, bab => 8, bac => 9}, bb => {bba => 10, bbb => 11, bbc => 12} } ); sub walk { my $node = shift; OUTER: foreach my $k (sort keys %{ $node }) { # replace these lines with the lines between *** # push @nodes, $k; # print join(", ", @nodes), "\n"; # *** print join(", ", @nodes) . (scalar(@nodes)?', ':''); foreach my $kInPath (@nodes) { if ($k eq $kInPath) { print "$k ... (circularity)\n"; next OUTER if ($k eq $kInPath); } } print "$k\n"; push @nodes, $k; # *** walk( $node->{$k} ) if ref $node->{$k}; pop @nodes; } } # outputs a a, aa a, aa, aaa a, aa, aab a, aa, aac a, aa, aac, aaa a, aa, aac, aab a, aa, aac, aac ... (circularity) a, ab a, ab, aba a, ab, abb a, ab, abc b b, ba b, ba, baa b, ba, bab b, ba, bac b, bb b, bb, bba b, bb, bbb b, bb, bbc

Also, it is a good idea to use named variables in your for loop rather than $_, i.e. for my $k (@nodes) instead of for (@nodes). It makes things like nested for loops a bit easier to manage and protects you from some odd side effects that can result if subroutines called within a for loop don't properly localize $_.

Update: Added code to show %nested_hash with circularity

Update: Added sample output.


In reply to Re^2: Iterating over nested hash by ELISHEVA
in thread Iterating over nested hash by Dirk80

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.