Login
RT #67760: RequireLexicalLoopIterators vs perl version
authorTom Wyant <harryfmudd@comcast.net>
Wed, 27 Apr 2011 13:45:33 +0000 (13:45 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Wed, 27 Apr 2011 13:45:33 +0000 (13:45 +0000)
The idea of the patch was accepted, but the implementation simply has
prepare_to_scan_document() return false if the highest explicit Perl
version is less than 5.004.

The associated documentation tweaks were also accepted in spirit but
re-tweaked.

A test was provided, and yes the Changes file was updated.

Changes
lib/Perl/Critic/Policy/Variables/RequireLexicalLoopIterators.pm
t/Variables/RequireLexicalLoopIterators.run

diff --git a/Changes b/Changes
index 12801b9..390193e 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,6 +1,9 @@
 Whenever the next release is
 
     Policy Changes:
+    * Variables::RequireLexicalLoopIterators does not report violations
+      if the document contains an explicit 'use n.nnn;' where the
+      version is before 5.004.  RT # 67760
     * RegularExpressions::ProhibitUnusedCapture should more reliably
       find things like s/(a)/${1}2/.  RT #67273.
     * Documentation::RequirePodSections no longer blows up on code
index 5e5c995..5e34367 100644 (file)
@@ -11,8 +11,9 @@ use 5.006001;
 use strict;
 use warnings;
 use Readonly;
+use version ();
 
-use Perl::Critic::Utils qw{ :severities };
+use Perl::Critic::Utils qw{ :booleans :severities };
 use base 'Perl::Critic::Policy';
 
 our $VERSION = '1.115';
@@ -22,6 +23,8 @@ our $VERSION = '1.115';
 Readonly::Scalar my $DESC => q{Loop iterator is not lexical};
 Readonly::Scalar my $EXPL => [ 108 ];
 
+Readonly::Scalar my $MINIMUM_PERL_VERSION => version->new( 5.004 );
+
 #-----------------------------------------------------------------------------
 
 sub supported_parameters { return ()                         }
@@ -31,6 +34,16 @@ sub applies_to           { return 'PPI::Statement::Compound' }
 
 #-----------------------------------------------------------------------------
 
+sub prepare_to_scan_document {
+    my ( $self, $document ) = @_;
+    # perl5004delta says that is when lexical iterators were introduced,
+    # so ... (RT 67760)
+    my $version = $document->highest_explicit_perl_version();
+    return ! $version || $version >= $MINIMUM_PERL_VERSION;
+}
+
+#-----------------------------------------------------------------------------
+
 sub violates {
     my ( $self, $elem, undef ) = @_;
 
@@ -60,6 +73,8 @@ __END__
 
 =pod
 
+=for stopwords foreach perlsyn
+
 =head1 NAME
 
 Perl::Critic::Policy::Variables::RequireLexicalLoopIterators - Write C<for my $element (@list) {...}> instead of C<for $element (@list) {...}>.
@@ -73,19 +88,28 @@ distribution.
 
 =head1 DESCRIPTION
 
-C<for>/C<foreach> loops I<always> create new lexical variables for
-named iterators.  In other words
+This policy asks you to use C<my>-style lexical loop iterator variables:
 
-    for $zed (...) {
+    foreach my $zed (...) {
         ...
     }
 
-is equivalent to
+Unless you use C<my>, C<for>/C<foreach> loops use a global variable with
+its value C<local> to the block. In other words,
 
-    for my $zed (...) {
+    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;
@@ -106,9 +130,13 @@ This may not seem like a big deal until you see code like
     }
 
 which is not going to allow you to arrive in time for dinner with your
-family because the C<$bicycle> outside the loop is different from the
-C<$bicycle> inside the loop.  You may have freed your bicycle, but you
-can't remember which one it was.
+family because the C<$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. C<use 5.002;>).
 
 
 =head1 CONFIGURATION
@@ -116,6 +144,13 @@ can't remember which one it was.
 This Policy is not configurable except for the standard options.
 
 
+=head1 SEE ALSO
+
+L<"Foreach Loops" in perlsyn|perlsyn/Foreach Loops>
+
+L<"my() in Control Structures" in perl5004delta|perl5004delta/my() in control structures>
+
+
 =head1 AUTHOR
 
 Jeffrey Ryan Thalhammer <jeff@imaginative-software.com>
index 8eca14c..347ccf9 100644 (file)
@@ -56,6 +56,19 @@ until ( $condition ) {}
 
 #-----------------------------------------------------------------------------
 
+## name Ignore really, really old Perls. RT #67760
+## failures 0
+## cut
+
+use 5.003;
+
+foreach $foo ( @list ) {
+    bar( $foo );
+}
+
+
+#-----------------------------------------------------------------------------
+
 ##############################################################################
 #      $URL$
 #     $Date$