File Coverage

blib/lib/Perl/Critic/Policy/RegularExpressions/ProhibitUnusualDelimiters.pm
Criterion Covered Total %
statement 26 33 78.7
branch 1 4 25.0
condition n/a
subroutine 11 12 91.6
pod 5 6 83.3
total 43 55 78.1


line stmt bran cond sub pod time code
1             package Perl::Critic::Policy::RegularExpressions::ProhibitUnusualDelimiters;
2              
3 40     40   27541 use 5.010001;
  40         193  
4 40     40   298 use strict;
  40         123  
  40         971  
5 40     40   270 use warnings;
  40         164  
  40         1173  
6 40     40   299 use Readonly;
  40         154  
  40         2527  
7              
8 40     40   382 use Perl::Critic::Utils qw{ :booleans :severities hashify };
  40         133  
  40         2211  
9              
10 40     40   7079 use parent 'Perl::Critic::Policy';
  40         151  
  40         346  
11              
12             our $VERSION = '1.150';
13              
14             #-----------------------------------------------------------------------------
15              
16             Readonly::Scalar my $DESC => q<Use only '//' or '{}' to delimit regexps>;
17             Readonly::Scalar my $EXPL => [246];
18              
19             Readonly::Array my @EXTRA_BRACKETS => qw{ () [] <> };
20              
21             #-----------------------------------------------------------------------------
22              
23             sub supported_parameters {
24             return (
25             {
26 90     90 0 1922 name => 'allow_all_brackets',
27             description =>
28             q[In addition to allowing '{}', allow '()', '[]', and '{}'.],
29             behavior => 'boolean',
30             },
31             );
32             }
33              
34 74     74 1 315 sub default_severity { return $SEVERITY_LOWEST }
35 84     84 1 335 sub default_themes { return qw( core pbp cosmetic ) }
36 30     30 1 117 sub applies_to { return qw(PPI::Token::Regexp::Match
37             PPI::Token::Regexp::Substitute
38             PPI::Token::QuoteLike::Regexp) }
39              
40             #-----------------------------------------------------------------------------
41              
42             sub initialize_if_enabled {
43 47     47 1 178 my ( $self, $config ) = @_;
44              
45 47         220 my %delimiters = hashify( qw< // {} > );
46 47 50       255 if ( $self->{_allow_all_brackets} ) {
47 0         0 @delimiters{ @EXTRA_BRACKETS } = (1) x @EXTRA_BRACKETS;
48             }
49              
50 47         164 $self->{_allowed_delimiters} = \%delimiters;
51              
52 47         181 return $TRUE;
53             }
54              
55             #-----------------------------------------------------------------------------
56              
57             sub violates {
58 0     0 1   my ( $self, $elem, undef ) = @_;
59              
60 0           my $allowed_delimiters = $self->{_allowed_delimiters};
61 0           foreach my $delimiter ($elem->get_delimiters()) {
62 0 0         next if $allowed_delimiters->{$delimiter};
63 0           return $self->violation( $DESC, $EXPL, $elem );
64             }
65              
66 0           return; # OK
67             }
68              
69             1;
70              
71             __END__
72              
73             #-----------------------------------------------------------------------------
74              
75             =pod
76              
77             =head1 NAME
78              
79             Perl::Critic::Policy::RegularExpressions::ProhibitUnusualDelimiters - Use only C<//> or C<{}> to delimit regexps.
80              
81              
82             =head1 AFFILIATION
83              
84             This Policy is part of the core L<Perl::Critic|Perl::Critic>
85             distribution.
86              
87              
88             =head1 DESCRIPTION
89              
90             Perl lets you delimit regular expressions with almost any character,
91             but most choices are illegible. Compare these equivalent expressions:
92              
93             s/foo/bar/; # good
94             s{foo}{bar}; # good
95             s#foo#bar#; # bad
96             s;foo;bar;; # worse
97             s|\|\||\||; # eye-gouging bad
98              
99              
100             =head1 CONFIGURATION
101              
102             There is one option for this policy, C<allow_all_brackets>. If this
103             is true, then, in addition to allowing C<//> and C<{}>, the other
104             matched pairs of C<()>, C<[]>, and C<< <> >> are allowed.
105              
106              
107             =head1 CREDITS
108              
109             Initial development of this policy was supported by a grant from the
110             Perl Foundation.
111              
112              
113             =head1 AUTHOR
114              
115             Chris Dolan <cdolan@cpan.org>
116              
117              
118             =head1 COPYRIGHT
119              
120             Copyright (c) 2007-2023 Chris Dolan
121              
122             This program is free software; you can redistribute it and/or modify
123             it under the same terms as Perl itself. The full text of this license
124             can be found in the LICENSE file included with this module
125              
126             =cut
127              
128             # Local Variables:
129             # mode: cperl
130             # cperl-indent-level: 4
131             # fill-column: 78
132             # indent-tabs-mode: nil
133             # c-indentation-style: bsd
134             # End:
135             # ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :