use strict; use Data::Dumper; open(IN, "<", "in.obo") || die "$!"; my %hash; my $term; while(){ chomp; if(/^id\:\s+(.*)/){ $term = $1; }elsif(/^is\_a\:\s+.*?\s+\!\s+(.*)/){ push(@{$hash{$term}},$1); } } close IN; print Dumper(\%hash);