The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

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

DESCRIPTION

The diamond operator <>, 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 <STDIN>;                      # not ok
  for (;<>;) { ... }                      # not ok
  while (readline $fh) { ... }            # not ok
  while (readdir $dh) { ... }             # not ok

  while (my $line = <$fh>) { ... }        # 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