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. 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
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.