how about something like...
use strict;
use warnings;
$|++;
my $person = shift @ARGV or die "Usage: $0 <personid>\n";
my %parent_of;
my %children_of;
while (my ($child, $parent) = split /\s/, <DATA>) {
$parent_of{$child} = $parent;
push @{$children_of{$parent}}, $child;
}
my @fathers;
for (my $lookat = $person; exists $parent_of{$lookat}; $lookat = $pare
+nt_of{$lookat}) {
push @fathers, $parent_of{$lookat};
}
my @sons = @{$children_of{$person}};
print "fathers of $person: @fathers$/";
print "sons of $person: @sons$/";
__DATA__
1045316394 1045316144
1045316407 1045316394
1045316419 1045316407
1045316438 1045316419
1045316469 1045316394
1045316492 1045316407
1045316505 1045316492
$ perl test.pl 1045316419
fathers of 1045316419: 1045316407 1045316394 1045316144
sons of 1045316419: 1045316438
this had bettern not be homework!