Perl::Critic::Policy::RegularExpressions::ProhibitFixedStringMatches - Use eq or hash instead of fixed-pattern regexps.
This Policy is part of the core Perl::Critic
distribution.
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};
Conway also suggests using lc() instead of a case-insensitive match.
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.
This Policy is not configurable except for the standard options.
Initial development of this policy was supported by a grant from the
Perl Foundation.
Chris Dolan <cdolan@cpan.org>
Copyright (c) 2007-2011 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
|