Login
Teach ControlStructures::ProhibitMutatingListFunctions that tr///r and
authorTom Wyant <harryfmudd@comcast.net>
Mon, 30 May 2011 16:21:47 +0000 (16:21 +0000)
committerTom Wyant <harryfmudd@comcast.net>
Mon, 30 May 2011 16:21:47 +0000 (16:21 +0000)
y///r do not modify their operands. The s///r case was taken care of
earlier.

Changes
TODO.pod
lib/Perl/Critic/Policy/ControlStructures/ProhibitMutatingListFunctions.pm
t/ControlStructures/ProhibitMutatingListFunctions.run

diff --git a/Changes b/Changes
index 4cb40c9..d9563fa 100644 (file)
--- a/Changes
+++ b/Changes
@@ -3,6 +3,8 @@ Next release, whenever it is:
     Policy Changes:
     * BuiltinFunctions::ProhibitLvalueSubstr: Add explicit 'use version'.
       RT #68498.
+    * ControlStructures::ProhibitMutatingListFunctions now understands that
+      tr///r (introduced in 5.13.7) does not change its operand.
     * Subroutines::ProhibitManyArgs now recognizes '+' as a prototype
       character.
 
index 234238f..ebb6cd9 100644 (file)
--- a/TODO.pod
+++ b/TODO.pod
@@ -146,12 +146,9 @@ addition of this item.
 
 =item * Detect 5.14 source and enable stuff for that.
 
-The s///r and tr///r operators return a new string rather than modifying
-their operands.
-
 5.13.7 allows references in many places where arrays or hashes used to
 be required (e.g. C<push $stack, 'foo'> where C<$stack> is an array
-ref). Not sure what policies are affected, but it appears this implies
+ref). Not sure what policies are affected.
 
 Lexical regular expression modifier defaults via (e.g.)
 C<use re '/smx'>). This also interacts with
index a4e4bd3..df60cf8 100644 (file)
@@ -159,11 +159,11 @@ sub _is_topic_mutating_regex {
     # flags are specified. RT 44515.
     if ( $elem->isa( 'PPI::Token::Regexp::Transliterate') ) {
         my $subs = $elem->get_substitute_string();
+        my %mods = $elem->get_modifiers();
+        $mods{r} and return;    # Introduced in Perl 5.13.7
         if ( $EMPTY eq $subs ) {
-            my %mods = $elem->get_modifiers();
             $mods{d} or $mods{s} or return;
         } elsif ( $elem->get_match_string() eq $subs ) {
-            my %mods = $elem->get_modifiers();
             $mods{c} or $mods{s} or return;
         }
     }
index d734fee..db3ff9a 100644 (file)
 
 #-----------------------------------------------------------------------------
 
+## name Recognize non-mutating tr///r function introduced in 5.13.7.
+## failures 0
+## cut
+
+@bar = map { tr/cat/dog/r } @foo;
+@bar = map { y/cat/dog/r } @foo;
+
+#-----------------------------------------------------------------------------
+
 ##############################################################################
 #      $URL$
 #     $Date$