logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Perl::Critic::Policy::Community::WhileDiamondDefaultAssignment - Don't use while with implicit assignment

Affiliation

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

Author

       Dan Book, "dbook@cpan.org"

Configuration

       This policy is not configurable except for the standard options.

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

Name

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

See Also

       Perl::Critic

perl v5.40.1                                       2025-03-22             Perl::Critic::P...faultAssignment(3pm)

See Also