in reply to localization of $_
perlman:perlsub, perlman:perlsyn and perlman:perlvar all have some comments about this, but it can be hard to get the picture from those without someone (or some bug) pointing it out. perlman:perlvar states that $_ is assigned to in your while case, but doesn't make it clear that $_ isn't localized by while as a foreach would.
Either localize $_ yourself, or switch to another while style for any loop that calls subroutines: while (my $line = <FILE>) {
|
|---|