use strict; use warnings; $|++; my $person = shift @ARGV or die "Usage: $0 \n"; my %parent_of; my %children_of; while (my ($child, $parent) = split /\s/, ) { $parent_of{$child} = $parent; push @{$children_of{$parent}}, $child; } my @fathers; for (my $lookat = $person; exists $parent_of{$lookat}; $lookat = $parent_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