你有什么试过的?这似乎工作,假设我们可以将整个内容加载到内存中。我还假设每条线只有一个上游值和一个下游值。允许更多的东西留给读者看。
#!/usr/bin/perl
use strict;
use warnings;
use 5.12.0;
my %links;
while(<DATA>)
{
my ($key, $val) = split ' ', $_;
$links{$key}{down}{$val} = 1; # dupes not allowed/ignored
$links{$val}{up}{$key} = 1;
}
sub gather_up
{
my $start = shift;
my $seen = shift || {};
my @up;
if ($links{$start}{up})
{
for my $u (sort keys %{$links{$start}{up}})
{
unless ($seen->{$u}++)
{
push @up, $u;
}
}
push @up, map { gather_up($_, $seen) } @up;
}
@up
}
say join ', ', gather_up('C');
__END__
A B
B C
C D
E C
哇,那是一个强大的工具。只是为了比较点,我跑了'print $ g-> all_predecessors('C'),“\ n”;'确实得到了'AEB' –