use Graph; my $g = Graph->new(directed => 1); $g->add_edge(split /:/) for qw/ a:d a:b c:b d:c /; my @order = $g->topological_sort; print join(", ", @order), "\n"; __END__ a, d, c, b