NAME

Perl::Critic::Policy::Freenode::WhileDiamondDefaultAssignment - Don't use while with implicit assignment to $_

DESCRIPTION

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. To avoid this possibility, 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

AFFILIATION

This policy is part of Perl::Critic::Freenode.

CONFIGURATION

This policy is not configurable except for the standard options.

AUTHOR

Dan Book, dbook@cpan.org

COPYRIGHT AND LICENSE

Copyright 2015, Dan Book.

This library is free software; you may redistribute it and/or modify it under the terms of the Artistic License version 2.0.

SEE ALSO

Perl::Critic