use Sort::Topological; use strict; use Data::Dumper; my %before = ( a => _s(qw(c)), b => _s(qw(d e)), c => _s(qw(l)), d => _s(qw(e a)), e => _s(qw(c)), f => _s(qw(g d)), g => _s(qw(c)), h => _s(qw(g i)), i => _s(qw()), j => _s(qw(c)), k => _s(qw()), l => _s(qw()), n => _s(qw(c)), o => _s(qw()), ); # print Dumper(\%before); my @order = reverse Sort::Topological::toposort( sub { @{$before{$_[0]}}; }, [ keys %before ], ); print "@order\n"; sub _s { [ @_ ]; #my %h = map { $_ => 1 } @_; #\%h } #### l c a e i g d o f b h k j n