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::ProhibitEscapedMetacharacters - Use character classes for

Affiliation

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

Author

       Chris Dolan <cdolan@cpan.org>

Bugs

       Perl treats "m/[#]/x" in unexpected ways.  I think it's a bug in Perl itself, but am not 100% sure that I
       have not simply misunderstood...

       This part makes sense:

           "#f" =~ m/[#]f/x;     # match
           "#f" =~ m/[#]a/x;     # no match

       This doesn't:

           $qr  = qr/f/;
           "#f" =~ m/[#]$qr/x; # no match

       Neither does this:

           print qr/[#]$qr/x;  # yields '(?x-ism:[#]$qr
                                       )'

Configuration

       This Policy is not configurable except for the standard options.

Credits

       Initial development of this policy was supported by a grant from the Perl Foundation.

Description

       Ever heard of leaning toothpick syndrome?  That comes from writing regular expressions that match on
       characters that are significant in regular expressions.  For example, the expression to match four
       forward slashes looks like:

           m/\/\/\/\//;

       Well, this policy doesn't solve that problem (write it as "m{////}" instead!) but solves a related one.
       As seen above, the escapes make the expression hard to parse visually.  One solution is to use character
       classes.  You see, inside of character classes, the only characters that are special are "\", "]", "^"
       and "-", so you don't need to escape the others.  So instead of the following loose IPv4 address matcher:

           m/ \d+ \. \d+ \. \d+ \. \d+ /x;

       You could write:

           m/ \d+ [.] \d+ [.] \d+ [.] \d+ /x;

       which is certainly more readable, if less recognizable prior the publication of Perl Best Practices.  (Of
       course, you should really use Regexp::Common::net to match IPv4 addresses!)

       Specifically, this policy forbids backslashes immediately prior to the following characters:

           { } ( ) . * + ? | #

       We make special exception for "$" because "/[$]/" turns into "/[5.008006/" for Perl 5.8.6.  We also make
       an exception for "^" because it has special meaning (negation) in a character class.  Finally, "[" and
       "]" are exempt, of course, because they are awkward to represent in character classes.

       Note that this policy does not forbid unnecessary escaping.  So go ahead and (pointlessly) escape "!"
       characters.

Name

       Perl::Critic::Policy::RegularExpressions::ProhibitEscapedMetacharacters - Use character classes for
       literal meta-characters instead of escapes.

See Also