in reply to hash printing - why a blank record ?

if you have blank lines in your data, you're not skipping them properly. try

next if /^\s*$/;
p.s. you can use Data::Dumper to see how your hash is being built.

use Data::Dumper; ## ... print Dumper \%species;

~Particle *accelerates*