---
name: "Perl::Critic::PolicySummary"
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::PolicySummary"
---

# Perl::Critic::PolicySummary(3pm)

Descriptions of the Policy modules included with Perl::Critic itself.

## NAME

Perl::Critic::PolicySummary - Descriptions of the Policy modules included with Perl::Critic itself.

## DESCRIPTION

The following Policy modules are distributed with Perl::Critic. (There are additional Policies that can be found in add-on distributions.)  The Policy modules have been categorized according to the table of contents in Damian Conway's book **Perl Best Practices**. Since most coding standards take the form "do this..." or "don't do that...", I have adopted the convention of naming each module `"RequireSomething"` or `"ProhibitSomething"`.  Each Policy is listed here with its default severity.  If you don't agree with the default severity, you can change it in your *.perlcriticrc* file (try `"perlcritic` `--profile-proto"` for a starting version).  See the documentation of each module for its specific details.

## POLICIES

### BuiltinFunctions::ProhibitBooleanGrep

Use `"any"` from `"List::Util"`, `"List::SomeUtils"`, or `"List::MoreUtils"` instead of `"grep"` in boolean context. \[Default severity 2\]

### BuiltinFunctions::ProhibitComplexMappings

Map blocks should have a single statement. \[Default severity 3\]

### BuiltinFunctions::ProhibitLvalueSubstr

Use 4-argument `"substr"` instead of writing `"substr($foo, 2, 6) = $bar"`. \[Default severity 3\]

### BuiltinFunctions::ProhibitReverseSortBlock

Forbid `$b` before `$a` in sort blocks. \[Default severity 1\]

### BuiltinFunctions::ProhibitShiftRef

Prohibit `"\shift"` in code \[Default severity 3\]

### BuiltinFunctions::ProhibitSleepViaSelect

Use Time::HiRes instead of something like `"select(undef, undef, undef, .05)"`. \[Default severity 5\]

### BuiltinFunctions::ProhibitStringyEval

Write `"eval { my $foo; bar($foo) }"` instead of `"eval "my $foo; bar($foo);""`. \[Default severity 5\]

### BuiltinFunctions::ProhibitStringySplit

Write `"split /-/, $string"` instead of `"split '-', $string"`. \[Default severity 2\]

### BuiltinFunctions::ProhibitUniversalCan

Write `"eval { $foo->can($name) }"` instead of `"UNIVERSAL::can($foo, $name)"`. \[Default severity 3\]

### BuiltinFunctions::ProhibitUniversalIsa

Write `"eval { $foo->isa($pkg) }"` instead of `"UNIVERSAL::isa($foo, $pkg)"`. \[Default severity 3\]

### BuiltinFunctions::ProhibitUselessTopic

Don't pass `$_` to built-in functions that assume it, or to most filetest operators. \[Default severity 2\]

### BuiltinFunctions::ProhibitVoidGrep

Don't use `"grep"` in void contexts. \[Default severity 3\]

### BuiltinFunctions::ProhibitVoidMap

Don't use `"map"` in void contexts. \[Default severity 3\]

### BuiltinFunctions::RequireBlockGrep

Write `"grep { /$pattern/ } @list"` instead of `"grep /$pattern/, @list"`. \[Default severity 4\]

### BuiltinFunctions::RequireBlockMap

Write `"map { /$pattern/ } @list"` instead of `"map /$pattern/, @list"`. \[Default severity 4\]

### BuiltinFunctions::RequireGlobFunction

Use `"glob q{*}"` instead of \<\*\>. \[Default severity 5\]

### BuiltinFunctions::RequireSimpleSortBlock

Sort blocks should have a single statement. \[Default severity 3\]

### ClassHierarchies::ProhibitAutoloading

AUTOLOAD methods should be avoided. \[Default severity 3\]

### ClassHierarchies::ProhibitExplicitISA

Employ `"use parent"` instead of `@ISA`. \[Default severity 3\]

### ClassHierarchies::ProhibitOneArgBless

Write `"bless {}, $class;"` instead of just `"bless {};"`. \[Default severity 5\]

### CodeLayout::ProhibitHardTabs

Use spaces instead of tabs. \[Default severity 3\]

### CodeLayout::ProhibitParensWithBuiltins

Write `"open $handle, $path"` instead of `"open($handle, $path)"`. \[Default severity 1\]

### CodeLayout::ProhibitQuotedWordLists

Write `"qw(foo bar baz)"` instead of `"('foo', 'bar', 'baz')"`. \[Default severity 2\]

### CodeLayout::ProhibitTrailingWhitespace

Don't use whitespace at the end of lines. \[Default severity 1\]

### CodeLayout::RequireConsistentNewlines

Use the same newline through the source. \[Default severity 4\]

### CodeLayout::RequireTidyCode

Must run code through perltidy. \[Default severity 1\]

### CodeLayout::RequireTrailingCommas

Put a comma at the end of every multi-line list declaration, including the last one. \[Default severity 1\]

### ControlStructures::ProhibitCStyleForLoops

Write `for(0..20)` instead of `"for($i=0; $i<=20; $i++)"`. \[Default severity 2\]

### ControlStructures::ProhibitCascadingIfElse

Don't write long "if-elsif-elsif-elsif-elsif...else" chains. \[Default severity 3\]

### ControlStructures::ProhibitDeepNests

Don't write deeply nested loops and conditionals. \[Default severity 3\]

### ControlStructures::ProhibitLabelsWithSpecialBlockNames

Don't use labels that are the same as the special block names. \[Default severity 4\]

### ControlStructures::ProhibitMutatingListFunctions

Don't modify `$_` in list functions. \[Default severity 5\]

### ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions

Don't use operators like `"not"`, `"!~"`, and `"le"` within `"until"` and `"unless"`. \[Default severity 3\]

### ControlStructures::ProhibitPostfixControls

Write `"if($condition){ do_something() }"` instead of `"do_something() if $condition"`. \[Default severity 2\]

### ControlStructures::ProhibitUnlessBlocks

Write `"if(! $condition)"` instead of `unless($condition)`. \[Default severity 2\]

### ControlStructures::ProhibitUnreachableCode

Don't write code after an unconditional `"die, exit, or next"`. \[Default severity 4\]

### ControlStructures::ProhibitUntilBlocks

Write `"while(! $condition)"` instead of `until($condition)`. \[Default severity 2\]

### ControlStructures::ProhibitYadaOperator

Never use `"..."` in production code. \[Default severity 4\]

### Documentation::PodSpelling

Check your spelling. \[Default severity 1\]

### Documentation::RequirePackageMatchesPodName

The `"=head1 NAME"` section should match the package. \[Default severity 1\]

### Documentation::RequirePodAtEnd

All POD should be after `"__END__"`. \[Default severity 1\]

### Documentation::RequirePodSections

Organize your POD into the customary sections. \[Default severity 2\]

### ErrorHandling::RequireCarping

Use functions from Carp instead of `"warn"` or `"die"`. \[Default severity 3\]

### ErrorHandling::RequireCheckingReturnValueOfEval

You can't depend upon the value of `$@`/`$EVAL_ERROR` to tell whether an `"eval"` failed. \[Default severity 3\]

### InputOutput::ProhibitBacktickOperators

Discourage stuff like ``"@files = `ls $directory`"``. \[Default severity 3\]

### InputOutput::ProhibitBarewordDirHandles

Write `"opendir my $dh, $dirname;"` instead of `"opendir DH, $dirname;"`. \[Default severity 5\]

### InputOutput::ProhibitBarewordFileHandles

Write `"open my $fh, q{<}, $filename;"` instead of `"open FH, q{<}, $filename;"`. \[Default severity 5\]

### InputOutput::ProhibitExplicitStdin

Use "\<\>" or "\<ARGV\>" or a prompting module instead of "\<STDIN\>". \[Default severity 4\]

### InputOutput::ProhibitInteractiveTest

Use **prompt()** instead of -t. \[Default severity 5\]

### InputOutput::ProhibitJoinedReadline

Use `"local $/ = undef"` or Path::Tiny instead of joined readline. \[Default severity 3\]

### InputOutput::ProhibitOneArgSelect

Never write `select($fh)`. \[Default severity 4\]

### InputOutput::ProhibitReadlineInForLoop

Write `"while( $line = <> ){...}"` instead of `"for(<>){...}"`. \[Default severity 4\]

### InputOutput::ProhibitTwoArgOpen

Write `"open $fh, q{<}, $filename;"` instead of `"open $fh, "<$filename";"`. \[Default severity 5\]

### InputOutput::RequireBracedFileHandleWithPrint

Write `"print {$FH} $foo, $bar;"` instead of `"print $FH $foo, $bar;"`. \[Default severity 1\]

### InputOutput::RequireBriefOpen

Close filehandles as soon as possible after opening them. \[Default severity 4\]

### InputOutput::RequireCheckedClose

Write `"my $error = close $fh;"` instead of `"close $fh;"`. \[Default severity 2\]

### InputOutput::RequireCheckedOpen

Write `"my $error = open $fh, $mode, $filename;"` instead of `"open $fh, $mode, $filename;"`. \[Default severity 3\]

### InputOutput::RequireCheckedSyscalls

Return value of flagged function ignored. \[Default severity 1\]

### InputOutput::RequireEncodingWithUTF8Layer

Write `"open $fh, q{<:encoding(UTF-8)}, $filename;"` instead of `"open $fh, q{<:utf8}, $filename;"`. \[Default severity 5\]

### Miscellanea::ProhibitFormats

Do not use `"format"`. \[Default severity 3\]

### Miscellanea::ProhibitTies

Do not use `"tie"`. \[Default severity 2\]

### Miscellanea::ProhibitUnrestrictedNoCritic

Forbid a bare `"## no critic"` \[Default severity 3\]

### Miscellanea::ProhibitUselessNoCritic

Remove ineffective "## no critic" annotations. \[Default severity 2\]

### Modules::ProhibitAutomaticExportation

Export symbols via `@EXPORT_OK` or `%EXPORT_TAGS` instead of `@EXPORT`. \[Default severity 4\]

### Modules::ProhibitConditionalUseStatements

Avoid putting conditional logic around compile-time includes. \[Default severity 3\]

### Modules::ProhibitEvilModules

Ban modules that aren't blessed by your shop. \[Default severity 5\]

### Modules::ProhibitExcessMainComplexity

Minimize complexity in code that is **outside** of subroutines. \[Default severity 3\]

### Modules::ProhibitMultiplePackages

Put packages (especially subclasses) in separate files. \[Default severity 4\]

### Modules::RequireBarewordIncludes

Write `"require Module"` instead of `"require 'Module.pm'"`. \[Default severity 5\]

### Modules::RequireEndWithOne

End each module with an explicitly `"1;"` instead of some funky expression. \[Default severity 4\]

### Modules::RequireExplicitPackage

Always make the `"package"` explicit. \[Default severity 4\]

### Modules::RequireFilenameMatchesPackage

Package declaration must match filename. \[Default severity 5\]

### Modules::RequireNoMatchVarsWithUseEnglish

`"use English"` must be passed a `"-no_match_vars"` argument. \[Default severity 2\]

### Modules::RequireVersionVar

Give every module a `$VERSION` number. \[Default severity 2\]

### NamingConventions::Capitalization

Distinguish different program components by case. \[Default severity 1\]

### NamingConventions::ProhibitAmbiguousNames

Don't use vague variable or subroutine names like 'last' or 'record'. \[Default severity 3\]

### Objects::ProhibitIndirectSyntax

Prohibit indirect object call syntax. \[Default severity 4\]

### References::ProhibitDoubleSigils

Write `"@{ $array_ref }"` instead of `@$array_ref`. \[Default severity 2\]

### RegularExpressions::ProhibitCaptureWithoutTest

Capture variable used outside conditional. \[Default severity 3\]

### RegularExpressions::ProhibitComplexRegexes

Split long regexps into smaller `"qr//"` chunks. \[Default severity 3\]

### RegularExpressions::ProhibitEnumeratedClasses

Use named character classes instead of explicit character lists. \[Default severity 1\]

### RegularExpressions::ProhibitEscapedMetacharacters

Use character classes for literal meta-characters instead of escapes. \[Default severity 1\]

### RegularExpressions::ProhibitFixedStringMatches

Use `"eq"` or hash instead of fixed-pattern regexps. \[Default severity 2\]

### RegularExpressions::ProhibitSingleCharAlternation

Use `"[abc]"` instead of `"a|b|c"`. \[Default severity 1\]

### RegularExpressions::ProhibitUnusedCapture

Only use a capturing group if you plan to use the captured value. \[Default severity 3\]

### RegularExpressions::ProhibitUnusualDelimiters

Use only `"//"` or `"{}"` to delimit regexps. \[Default severity 1\]

### RegularExpressions::ProhibitUselessTopic

Don't use `$_` to match against regexes. \[Default severity 2\]

### RegularExpressions::RequireBracesForMultiline

Use `"{"` and `"}"` to delimit multi-line regexps. \[Default severity 1\]

### RegularExpressions::RequireDotMatchAnything

Always use the `"/s"` modifier with regular expressions. \[Default severity 2\]

### RegularExpressions::RequireExtendedFormatting

Always use the `"/x"` modifier with regular expressions. \[Default severity 3\]

### RegularExpressions::RequireLineBoundaryMatching

Always use the `"/m"` modifier with regular expressions. \[Default severity 2\]

### Subroutines::ProhibitAmpersandSigils

Don't call functions with a leading ampersand sigil. \[Default severity 2\]

### Subroutines::ProhibitBuiltinHomonyms

Don't declare your own `"open"` function. \[Default severity 4\]

### Subroutines::ProhibitExcessComplexity

Minimize complexity by factoring code into smaller subroutines. \[Default severity 3\]

### Subroutines::ProhibitExplicitReturnUndef

Return failure with bare `"return"` instead of `"return undef"`. \[Default severity 5\]

### Subroutines::ProhibitManyArgs

Too many arguments. \[Default severity 3\]

### Subroutines::ProhibitNestedSubs

`"sub never { sub correct {} }"`. \[Default severity 5\]

### Subroutines::ProhibitReturnSort

Behavior of `"sort"` is not defined if called in scalar context. \[Default severity 5\]

### Subroutines::ProhibitSubroutinePrototypes

Don't write `"sub my_function (@@) {}"`. \[Default severity 5\]

### Subroutines::ProhibitUnusedPrivateSubroutines

Prevent unused private subroutines. \[Default severity 3\]

### Subroutines::ProtectPrivateSubs

Prevent access to private subs in other packages. \[Default severity 3\]

### Subroutines::RequireArgUnpacking

Always unpack `@_` first. \[Default severity 4\]

### Subroutines::RequireFinalReturn

End every path through a subroutine with an explicit `"return"` statement. \[Default severity 4\]

### TestingAndDebugging::ProhibitNoStrict

Prohibit various flavors of `"no strict"`. \[Default severity 5\]

### TestingAndDebugging::ProhibitNoWarnings

Prohibit various flavors of `"no warnings"`. \[Default severity 4\]

### TestingAndDebugging::ProhibitProlongedStrictureOverride

Don't turn off strict for large blocks of code. \[Default severity 4\]

### TestingAndDebugging::RequireTestLabels

Tests should all have labels. \[Default severity 3\]

### TestingAndDebugging::RequireUseStrict

Always `"use strict"`. \[Default severity 5\]

### TestingAndDebugging::RequireUseWarnings

Always `"use warnings"`. \[Default severity 4\]

### ValuesAndExpressions::ProhibitCommaSeparatedStatements

Don't use the comma operator as a statement separator. \[Default severity 4\]

### ValuesAndExpressions::ProhibitComplexVersion

Prohibit version values from outside the module. \[Default severity 3\]

### ValuesAndExpressions::ProhibitConstantPragma

Don't `"use constant FOO => 15"`. \[Default severity 4\]

### ValuesAndExpressions::ProhibitEmptyQuotes

Write `"q{}"` instead of `''`. \[Default severity 2\]

### ValuesAndExpressions::ProhibitEscapedCharacters

Write `"\N{DELETE}"` instead of `"\x7F"`, etc. \[Default severity 2\]

### ValuesAndExpressions::ProhibitImplicitNewlines

Use concatenation or HEREDOCs instead of literal line breaks in strings. \[Default severity 3\]

### ValuesAndExpressions::ProhibitInterpolationOfLiterals

Always use single quotes for literal strings. \[Default severity 1\]

### ValuesAndExpressions::ProhibitLeadingZeros

Write `oct(755)` instead of `0755`. \[Default severity 5\]

### ValuesAndExpressions::ProhibitLongChainsOfMethodCalls

Long chains of method calls indicate tightly coupled code. \[Default severity 2\]

### ValuesAndExpressions::ProhibitMagicNumbers

Don't use values that don't explain themselves. \[Default severity 2\]

### ValuesAndExpressions::ProhibitMismatchedOperators

Don't mix numeric operators with string operands, or vice-versa. \[Default severity 3\]

### ValuesAndExpressions::ProhibitMixedBooleanOperators

Write `" !$foo && $bar || $baz "` instead of `" not $foo && $bar or $baz"`. \[Default severity 4\]

### ValuesAndExpressions::ProhibitNoisyQuotes

Use `"q{}"` or `"qq{}"` instead of quotes for awkward-looking strings. \[Default severity 2\]

### ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters

Don't use quotes (`"'"`, `"""`, ``"`"``) as delimiters for the quote-like operators. \[Default severity 3\]

### ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator

Don't write `" print <<'__END__' "`. \[Default severity 3\]

### ValuesAndExpressions::ProhibitVersionStrings

Don't use strings like `"v1.4"` or `1.4.5` when including other modules. \[Default severity 3\]

### ValuesAndExpressions::RequireConstantVersion

Require `$VERSION` to be a constant rather than a computed value. \[Default severity 2\]

### ValuesAndExpressions::RequireInterpolationOfMetachars

Warns that you might have used single quotes when you really wanted double-quotes. \[Default severity 1\]

### ValuesAndExpressions::RequireNumberSeparators

Write `" 141_234_397.0145 "` instead of ` 141234397.0145 `. \[Default severity 2\]

### ValuesAndExpressions::RequireQuotedHeredocTerminator

Write `" print <<'THE_END' "` or `" print <<"THE_END" "`. \[Default severity 3\]

### ValuesAndExpressions::RequireUpperCaseHeredocTerminator

Write `" <<'THE_END'; "` instead of `" <<'theEnd'; "`. \[Default severity 2\]

### Variables::ProhibitAugmentedAssignmentInDeclaration

Do not write `" my $foo .= 'bar'; "`. \[Default severity 4\]

### Variables::ProhibitConditionalDeclarations

Do not write `" my $foo = $bar if $baz; "`. \[Default severity 5\]

### Variables::ProhibitEvilVariables

Ban variables that aren't blessed by your shop. \[Default severity 5\]

### Variables::ProhibitLocalVars

Use `"my"` instead of `"local"`, except when you have to. \[Default severity 2\]

### Variables::ProhibitMatchVars

Avoid ``"$`"``, `$&`, `"$'"` and their English equivalents. \[Default severity 4\]

### Variables::ProhibitPackageVars

Eliminate globals declared with `"our"` or `"use vars"`. \[Default severity 3\]

### Variables::ProhibitPerl4PackageNames

Use double colon (::) to separate package name components instead of single quotes ('). \[Default severity 2\]

### Variables::ProhibitPunctuationVars

Write `$EVAL_ERROR` instead of `$@`. \[Default severity 2\]

### Variables::ProhibitReusedNames

Do not reuse a variable name in a lexical scope \[Default severity 3\]

### Variables::ProhibitUnusedVariables

Don't ask for storage you don't need. \[Default severity 3\]

### Variables::ProtectPrivateVars

Prevent access to private vars in other packages. \[Default severity 3\]

### Variables::RequireInitializationForLocalVars

Write `"local $foo = $bar;"` instead of just `"local $foo;"`. \[Default severity 3\]

### Variables::RequireLexicalLoopIterators

Write `"for my $element (@list) {...}"` instead of `"for $element (@list) {...}"`. \[Default severity 5\]

### Variables::RequireLocalizedPunctuationVars

Magic variables should be assigned as "local". \[Default severity 4\]

### Variables::RequireNegativeIndices

Negative array index should be used. \[Default severity 4\]

## VERSION

This is part of Perl::Critic version 1.126.

## AUTHOR

Jeffrey Ryan Thalhammer \<jeff@imaginative-software.com\>

## COPYRIGHT

Copyright (c) 2005-2011 Imaginative Software Systems.  All 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.
