sub _findPaths2 { my( $code, $graph, $start, $end, $path, $seen ) = @_; return $code->( @$path, $end ) if $start eq $end; $seen->{ $start } = 1; for ( grep !$seen->{ $_ }, @{ $graph->{ $start } } ) { _findPaths2( $code, $graph, $_, $end, [ @$path, $start ], { %$seen } ), } } sub findPaths2(&@) { _findPaths2( @_, [], {} ); } findPaths2{ print join ' ', @_; } \%graph, $start, $end;