use Data::Dumper; $Data::Dumper::Indent = 1; my @remove; while (%depend) { # Clear dependencies foreach my $dep (values %depend) { @$dep = grep {exists $depend{$_}} @$dep; } # What can I remove? my @can_remove = grep {0 == @{$depend{$_}}} keys %depend; if (@can_remove) { delete $depend{$_} foreach @can_remove; push @remove, @can_remove; } else { # Uh, oh print "CIRCULAR DEPENDENCIES DETECTED\n"; print Data::Dumper->Dump ([\%depend], ['*depend']); die "ABORTING"; } } print Data::Dumper->Dump([\@remove], ['*remove']);