in reply to Re^2: Changing array by changing $_?
in thread Changing array by changing $_?

That doesn't help the fact that you are modifying a global variable ($_) without localizing it first. Why use a global variable at all!
foreach (@species) { ( my $species = $_ ) =~ s/^-//; unless (exists $refspecies{$species}) { die "$species is not in the species table\n"; } }