何を試しましたか?すべてをメモリにロードできると仮定すると、これは機能しているようです。また、各ラインには1つのアップストリーム値と1つのダウンストリーム値しかないと仮定しました。より多くを許可することは、読者のための演習として残されています。
#!/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