use strict; use warnings; my %before = ( a => ['c'], b => ['d','e'], c => ['l'], d => ['e','a'], e => ['c'], f => ['g','d'], g => ['c'], h => ['g','i'], i => [], j => ['c'], k => [], l => [], n => ['c'], o => [], ); my ($k, $m, %p, @order); while (scalar keys %before) { for $k (keys %before) { $m = 1; for (@{$before{$k}}) { if (!exists $p{$_}) { $m = 0; last; } } if ($m) { push(@order, $k); $p{$k} = (); delete($before{$k}); } } } @order = reverse @order; print @order;