---
name: "Perl::Critic::Policy::RegularExpressions::ProhibitFixedStringMatches"
section: "3pm"
platform: "linux"
package: "perl-perl-critic"
version: "1.156-3"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Perl::Critic::Policy::RegularExpressions::ProhibitFixedStringMatches"
---

# Perl::Critic::Policy::RegularExpressions::ProhibitFixedStringMatches(3pm)

Use "eq" or hash instead of fixed-pattern regexps.

## NAME

Perl::Critic::Policy::RegularExpressions::ProhibitFixedStringMatches - Use "eq" or hash instead of fixed-pattern regexps.

## AFFILIATION

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

## DESCRIPTION

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.

### VARIANTS

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.

## 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.

## AUTHOR

Chris Dolan \<cdolan@cpan.org\>

## COPYRIGHT

Copyright (c) 2007-2023 Chris Dolan

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
