#!perl use strict; use warnings; sub returnParsed { my ($array, $index, $level) = @_; my $levelhash = {}; while ($index < @$array) { last if ($array->[$index]->{'level'} < $level); if ($array->[$index]->{'level'} == $level) { $levelhash->{$array->[$index]->{'department'}} = returnParsed($array, $index + 1, $level + 1); } ++$index; } return $levelhash; } sub dumpSorted { my ($structure, $indent, $startindent) = @_; my $dumped = ''; for (sort keys %$structure) { $dumped .= " " x $startindent . "$_\n"; $dumped .= dumpSorted($structure->{$_}, $indent, $startindent + $indent); } return $dumped; } my @array = ({ level => 1, department => 'Office of President', }, { level => 2, department => 'Recruiting', }, { level => 2, department => 'Software', }, { level => 3, department => 'MIS', }, { level => 3, department => 'System Operations', }, { level => 2, department => 'Pipe line', }, ); print dumpSorted(returnParsed(\@array, 0, 1), 3, 3);