On 10/01/2013 10:01, budi perl wrote:
Hi,
I have this following hash:
#!/usr/bin/perl
#
use strict;
use Data::Dumper;
my %MYROUTES = (
"ROUTE-252" => {
# src => dest
427 => "ABEP",
"ABEP" => 441,
441 => 427,
427 => 444,
444 => "MGWQ",
"MGWQ" => "CDEF"
},
"ROUTE-432" => {
"AAA" => "BBB",
"BBB" => "CCC",
"CCC" => "DDD",
"XXX" => "YYY",
"YYY" => "ZZZ"
}
);
print Dumper %MYROUTES;
__END__
Expected results:
ROUTE-252: 427 - ABEP - 441 - 427 - 444 - MGWQ - CDEF
ROUTE-432: Error: can not follow the route!
or if possible can be more specific on how many link founds:
Error, some path is missing:
ROUTE-432: AAA - BBB - CCC -DDD
ROUTE-432: XXX - YYY -ZZZ
I put data in order for brevity, actual data may not.
Can someone shed some light how to find head then follow the path as above?
This calls for a proper module that has been thoroughly tested. The
program below uses Graph::Directed. Beware that it does no checks for
things like cyclic links, but it does print the path to /all/ end points
starting at each source.
HTH,
Rob
use v5.10;
use warnings;
use Graph::Directed;
my %routes = (
"ROUTE-252" => { 427 => 444, 441 => 427, 444 => "MGWQ", ABEP => 441,
MGWQ => "CDEF" },
"ROUTE-432" => { AAA => "BBB", BBB => "CCC", CCC => "DDD", XXX =>
"YYY", YYY => "ZZZ" },
);
while (my ($label, $edges) = each %routes) {
my $graph = Graph::Directed->new;
while (my ($start, $end) = each %$edges) {
$graph->add_edge($start, $end);
}
my @sinks = $graph->sink_vertices;
for my $source ($graph->source_vertices) {
for my $sink (grep $graph->is_sink_vertex($_),
$graph->all_successors($source)) {
say "$label: ", join ' - ', $graph->path_vertices($source, $sink);
}
}
}
**output**
ROUTE-252: ABEP - 441 - 427 - 444 - MGWQ - CDEF
ROUTE-432: AAA - BBB - CCC - DDD
ROUTE-432: XXX - YYY - ZZZ
--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/