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::RegularExpressions::ProhibitCaptureWithoutTest - Capture variable used outside

Affiliation

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

Author

       Chris Dolan <cdolan@cpan.org>

Bugs

       This policy does not recognize named capture variables. Yet.

Configuration

       By default, this policy considers "die", "croak", and "confess" to throw exceptions. If you have
       additional subroutines or methods that may be used in lieu of one of these, you can configure them in
       your perlcriticrc as follows:

        [RegularExpressions::ProhibitCaptureWithoutTest]
        exception_source = my_exception_generator

Description

       If a regexp match fails, then any capture variables ($1, $2, ...) will be unaffected.  They will retain
       whatever old values they may have had.  Therefore it's important to check the return value of a match
       before using those variables.

           '12312123' =~ /(2)/;
           print $1;    # Prints 2
           '123123123' =~ /(X)/;
           print $1;    # Prints 2, because $1 has not changed.

       Note that because the values of $1 etc will be unaffected, you cannot determine if a match succeeded by
       checking to see if the capture variables have values.

           # WRONG
           $str =~ /foo(.+)/;
           if ( $1 ) {
               print "I found $1 after 'foo'";
           }

       This policy checks that the previous regexp for which the capture variable is in-scope is either in a
       conditional or causes an exception or other control transfer (i.e. "next", "last", "redo", "return", or
       sometimes "goto") if the match fails.

       A "goto" is only accepted by this policy if it is a co-routine call (i.e.  "goto &foo") or a "goto LABEL"
       where the label does not fall between the "goto" and the capture variable in the scope of the "goto". A
       computed "goto" (i.e. something like "goto (qw{foo bar baz})[$i]") is not accepted by this policy because
       its target can not be statically determined.

       This policy does not check whether that conditional is actually testing a regexp result, nor does it
       check whether a regexp actually has a capture in it.  Those checks are too hard.

       This policy also does not check arbitrarily complex conditionals guarding regexp results, for pretty much
       the same reason.  Simple things like

        m/(foo)/ or die "No foo!";
        die "No foo!" unless m/(foo)/;

       will be handled, but something like

        m/(foo)/ or do {
          ... lots of complicated calculations here ...
          die "No foo!";
        };

       are beyond its scope.

Name

       Perl::Critic::Policy::RegularExpressions::ProhibitCaptureWithoutTest - Capture variable used outside
       conditional.

See Also