#! perl -slw use strict; sub traverse { my( $ref, $under, $level, $code ) = @_; for my $node ( grep{ $_->{level} == $level && $_->{under} == $under } @$ref ) { local $_ = $node; $code->(); traverse( $ref, $node->{pageid}, $level+1, $code ); } } my $sqldata = [ { pageid => 1, level => 1, under => 0, pagename => 'Groups' }, { pageid => 2, level => 1, under => 0, pagename => 'About' }, { pageid => 5, level => 3, under => 4, pagename => 'Tea' }, { pageid => 4, level => 2, under => 1, pagename => 'Womens' }, { pageid => 6, level => 4, under => 5, pagename => 'Registration' }, { pageid => 7, level => 2, under => 1, pagename => 'Mens' }, { pageid => 8, level => 3, under => 4, pagename => 'Retreat' } ]; traverse $sqldata, 0, 1, sub { print '---' x ( $_->{level} - 1 ), $_->{pagename}, '
'; }; __END__ P:\test>457652 Groups
---Womens
------Tea
---------Registration
------Retreat
---Mens
About