Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re (tilly) 1: Recursive generation of a sorted list from a hash

by tilly (Archbishop)
on Mar 23, 2001 at 17:43 UTC ( [id://66619]=note: print w/replies, xml ) Need Help??


in reply to Recursive generation of a sorted list from a hash

I am wondering if you have circular dependencies.

The following snippet won't actually figure out what the circular dependency is, but it will report if that is the problem, and will at least cut down the list to just the circular dependencies and things that depend on the circular dependencies. It shouldn't be too hard for you to modify this to find an actual recursive dependency in your list.

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']);

Replies are listed 'Best First'.
Re: Re (tilly) 1: Recursive generation of a sorted list from a hash
by hawson (Monk) on Mar 23, 2001 at 21:12 UTC
    Thanks.

    It doesn't handle circular references..in fact, I think that is why it fails at the moment. I'm going to add some logic in there to see if a node has already been processed, and post the changes.

      A fairly simple change to my script fixed the problem. In each call to &Recurse I additionally pass a @stack list. This list contains all of the 'parent' nodes in the call tree. So when the function runs, it checks to see if the node is present in @stack, then I know there is circular reference.

      So, the inital invocation of &Recurse becomes: &Recurse($_,()), and subsequent calls (the truly recursive ones) turn into: &Recurse($node,@stack,$node).

      This works, although tilly has a much more compact solution. :-)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://66619]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (5)
As of 2024-04-25 16:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found