/usr/local/perl/lib/site_perl/5.8.5/Perl/Critic/Policy/RegularExpressions/ProhibitFixedStringMatches.pm |
Perl::Critic::Policy::RegularExpressions::ProhibitFixedStringMatches
A regular expression that matches just a fixed set of constant strings is wasteful
of performance and is hard on maintainers. It is much more readable and
often faster to use eq
or a hash to match such strings.
# Bad my $is_file_function = $token =~ m/\A (?: open | close | read ) \z/xms;
# Faster and more readable my $is_file_function = $token eq 'open' || $token eq 'close' || $token eq 'read';
For larger numbers of strings, a hash is superior:
# Bad my $is_perl_keyword = $token =~ m/\A (?: chomp | chop | chr | crypt | hex | index lc | lcfirst | length | oct | ord | ... ) \z/xms;
# Better Readonly::Hash my %PERL_KEYWORDS => map {$_ => 1} qw( chomp chop chr crypt hex index lc lcfirst length oct ord ... ); my $is_perl_keyword = $PERL_KEYWORD{$token};
This policy detects both grouped and non-grouped strings. The grouping may or
may not be capturing. The grouped body may or may not be alternating. \A
and \z
are always considered anchoring which ^
and $
are considered
anchoring is the m
regexp option is not in use. Thus, all of these are
violations:
m/^foo$/; m/\A foo \z/x; m/\A foo \z/xm; m/\A(foo)\z/; m/\A(?:foo)\z/; m/\A(foo|bar)\z/; m/\A(?:foo|bar)\z/;
Furthermore, this policy detects violations in m//
, s///
and qr//
constructs, as you would expect.
Initial development of this policy was supported by a grant from the Perl Foundation.
Chris Dolan <cdolan@cpan.org>
Copyright (c) 2007 Chris Dolan. Many rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of this license can be found in the LICENSE file included with this module
/usr/local/perl/lib/site_perl/5.8.5/Perl/Critic/Policy/RegularExpressions/ProhibitFixedStringMatches.pm |