Thanks monks, I think I have a piece of working code. I still get a few errors, but I think it is from inconsistencies in the datafile. I will post the final code below, and if someone finds more errors I will check back periodically.
#!/usr/bin/perl
use strict;
use warnings;
# prints out inhibited object, directly activated ohjects, directly de
+activated objects, indirectly activated objects, indirectly deacivate
+d objects
print "Modified Object\tActivated Objects\tDeactivated Objects\n";
open(DAT,'<',"./useful_dat.tab")||die "Canot open file\n";
my @file=<DAT>;
close DAT;
shift @file;##remove header
my @activated;
my @inhibited;
my %true;
foreach my $line(@file){
my @line=split(/\t/,$line);
if($true{$line[0]}){
next;#if element has already come up, skip it
}
else{
$true{$line[0]}=1;#if object has already come up, store true
}
print "$line[0]\t";#inhibited object
&inhibited_rec($line[0]);
foreach(@activated){
print "$_,";
}
print "\t";
foreach(@inhibited){
print "$_,";
}
print "\n";
}
sub inhibited_rec{
my @a=`awk '\$1 ~ /$_[0]/' useful_dat.tab |cut -f 2,3|sort|uniq`;
foreach (@a){
my @b=split(/\t/,$_);
chomp $b[1];
if($b[1] eq 'Activation'){
}
else{
push (@activated,$b[0]);
if($true{$b[0]}){
next;
}
else{
$true{$b[0]}=1;
&activated_rec($b[0]);
}
}
}
}
sub activated_rec{
my @a=`awk '\$1 ~ /$_[0]/' useful_dat.tab |cut -f 2,3|sort|uniq`;
foreach (@a){
my @b=split(/\t/,$_);
chomp $b[1];
if($b[1] eq 'Activation'){
push (@activated,$b[0]);
if($true{$b[0]}){
next;
}
else{
$true{$b[0]}=1;
&activated_rec($b[0]);
}
}
else{
push (@inhibited,$b[0]);
if($true{$b[0]}){
next;
}
else{
$true{$b[0]}=1;
&inhibited_rec($b[0]);
}
}
}
}