#! perl -slw use strict; use Data::Dump qw[ pp ]; my %graph =( F => ['B','C','E'], A => ['B','C'], D => ['B'], C => ['A','E','F'], E => ['C','F'], B => ['A','E','F'] ); sub findPaths { my( $seen, $start, $end ) = @_; return [[$end]] if $start eq $end; $seen->{ $start } = 1; my @paths; for my $node ( @{ $graph{ $start } } ) { my %seen = %{$seen}; next if exists $seen{ $node }; push @paths, [ $start, @$_ ] for @{ findPaths( \%seen, $node, $end ) }; } return \@paths; } my( $start, $end ) = @ARGV; print "@$_" for @{ findPaths( {}, $start, $end ) }; __END__ c:\test>868031 B E B A C E B A C F E B E B F C E B F E c:\test>868031 A F A B E C F A B E F A B F A C E F A C F c:\test>868031 A C A B E C A B E F C A B F C A B F E C A C