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::Variables::RequireLexicalLoopIterators - Write "for my $element (@list) {...}"

Affiliation

       This Policy is part of the core Perl::Critic distribution.

Author

       Jeffrey Ryan Thalhammer <jeff@imaginative-software.com>

Configuration

       This Policy is not configurable except for the standard options.

Description

       This policy asks you to use "my"-style lexical loop iterator variables:

           foreach my $zed (...) {
               ...
           }

       Unless you use "my", "for"/"foreach" loops use a global variable with its value "local" to the block. In
       other words,

           foreach $zed (...) {
               ...
           }

       is more-or-less equivalent to

           {
               local $zed
               foreach $zed (...) {
                   ...
               }
           }

       This may not seem like a big deal until you see code like

           my $bicycle;
           for $bicycle (@things_attached_to_the_bike_rack) {
               if (
                       $bicycle->is_red()
                   and $bicycle->has_baseball_card_in_spokes()
                   and $bicycle->has_bent_kickstand()
               ) {
                   $bicycle->remove_lock();

                   last;
               }
           }

           if ( $bicycle and $bicycle->is_unlocked() ) {
               ride_home($bicycle);
           }

       which is not going to allow you to arrive in time for dinner with your family because the $bicycle
       outside the loop is not changed by the loop. You may have unlocked your bicycle, but you can't remember
       which one it was.

       Lexical loop variables were introduced in Perl 5.004. This policy does not report violations on code
       which explicitly specifies an earlier version of Perl (e.g. "require 5.002;").

Name

       Perl::Critic::Policy::Variables::RequireLexicalLoopIterators - Write "for my $element (@list) {...}"
       instead of "for $element (@list) {...}".

See Also

       "Foreach Loops" in perlsyn

       "my() in Control Structures" in perl5004delta

See Also