$dat{"./file"} = 1; $dat{"./a"} = 2; $dat{"./a/ab"} = 3; $dat{"./a/a"} = 4; $dat{"./aa/ba"} = 5; foreach (sort by_dir keys %dat) { print "dat = $dat{$_} for $_\n"; } sub by_dir { local ($aa, $bb, $na, $nb); $na = $nb = 0; $aa = $a; $bb = $b; while ($aa =~ s/\///) { $na += 1; } while ($bb =~ s/\///) { $nb += 1; } if ($na > $nb) { 1; } elsif ($na < $nb) { -1; } else { $a cmp $b; } }