J'ai un code qui fonctionne bien ici:Encapsulation récursive Fonction en Perl
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
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 = "B";
my $end = "E";
print "@$_\n" for @{ findPaths({}, $start, $end) };
Ce que je veux faire est de générer un sous-programme plus général de sorte qu'il suffit de prendre \%graph, $start,$end
en entrée et le retour tableau final.
J'ai essayé de le faire de cette façon mais il ne compile pas.
sub findPathsAll {
my ($graph,$start,$end) = @_;
my $findPaths_sub;
$findPaths_sub {
my($seen) = @_;
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_sub(\%seen, $node, $end) };
}
return \@paths;
}
my @all;
push @all,@$_ for @{ &$findPaths_sub({}, $start, $end) };
return @all;
}
Quelle est la bonne façon de le faire?