The diamond operator "<>" (or "<<>>"), and functions readline(), readdir(), and each() are extra magical
in a while condition: if it is the only thing in the condition, it will assign its result to $_, but it
does not localize $_ to the while loop. (Note, this also applies to a "for (;<>;)" construct.) This can
unintentionally confuse outer loops that are already using $_ to iterate. In addition, using $_ at all
means that your loop can get confused by other code which does not politely localize its usage of the
global variable. To avoid these possibilities, assign the result of the diamond operator or these
functions to an explicit lexical variable.
while (<$fh>) { ... } # not ok
while (<<>>) { ... } # not ok
... while <STDIN>; # not ok
for (;<>;) { ... } # not ok
while (readline $fh) { ... } # not ok
while (readdir $dh) { ... } # not ok
while (my $line = <$fh>) { ... } # ok
while (my $line = <<>>) { ... } # ok
... while $line = <STDIN>; # ok
for (;my $line = <>;) { ... } # ok
while (my $line = readline $fh) { ... } # ok
while (my $dir = readdir $dh) { ... } # ok