use Graph::Directed; my $network = Graph::Directed->new(); # Build a directed network of partners and members foreach my $partner ( keys %partners ) { foreach my $item ( @{ $partners{$partner} ) { # Add each pairing as a network edge with weight 1 $network->add_edge( $partner, $item ); $network->set_attribute('weight', $partner, $item, 1); } } # Now build a shortest-path network my $friends = $network->APSP_Floyd_Warshall(); # Now review all of the links in the network my $required_level = 2; my ( @all_levels ) = $friends->edges(); while ( scalar @all_levels ) { my ( $from, $to ) = splice(@all_levels, 0, 2); my $degrees = $friends->get_attribute('weight', $from, $to); next if ( $degrees > $required_level ); push @{ $allmembers{$from} }, $to; }