.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "Perl::Critic::PolicySummary 3pm" .TH Perl::Critic::PolicySummary 3pm 2025-07-14 "perl v5.42.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH NAME Perl::Critic::PolicySummary \- Descriptions of the Policy modules included with Perl::Critic itself. .SH DESCRIPTION .IX Header "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\*(Aqs book \fBPerl Best Practices\fR. Since most coding standards take the form "do this..." or "don\*(Aqt do that...", I have adopted the convention of naming each module \f(CW\*(C`RequireSomething\*(C'\fR or \f(CW\*(C`ProhibitSomething\*(C'\fR. Each Policy is listed here with its default severity. If you don\*(Aqt agree with the default severity, you can change it in your \fI.perlcriticrc\fR file (try \f(CW\*(C`perlcritic \&\-\-profile\-proto\*(C'\fR for a starting version). See the documentation of each module for its specific details. .SH POLICIES .IX Header "POLICIES" .SS BuiltinFunctions::ProhibitBooleanGrep .IX Subsection "BuiltinFunctions::ProhibitBooleanGrep" Use \f(CW\*(C`any\*(C'\fR from \f(CW\*(C`List::Util\*(C'\fR, \f(CW\*(C`List::SomeUtils\*(C'\fR, or \f(CW\*(C`List::MoreUtils\*(C'\fR instead of \f(CW\*(C`grep\*(C'\fR in boolean context. [Default severity 2] .SS BuiltinFunctions::ProhibitComplexMappings .IX Subsection "BuiltinFunctions::ProhibitComplexMappings" Map blocks should have a single statement. [Default severity 3] .SS BuiltinFunctions::ProhibitLvalueSubstr .IX Subsection "BuiltinFunctions::ProhibitLvalueSubstr" Use 4\-argument \f(CW\*(C`substr\*(C'\fR instead of writing \f(CW\*(C`substr($foo, 2, 6) = $bar\*(C'\fR. [Default severity 3] .SS BuiltinFunctions::ProhibitReverseSortBlock .IX Subsection "BuiltinFunctions::ProhibitReverseSortBlock" Forbid \f(CW$b\fR before \f(CW$a\fR in sort blocks. [Default severity 1] .SS BuiltinFunctions::ProhibitShiftRef .IX Subsection "BuiltinFunctions::ProhibitShiftRef" Prohibit \f(CW\*(C`\eshift\*(C'\fR in code [Default severity 3] .SS BuiltinFunctions::ProhibitSleepViaSelect .IX Subsection "BuiltinFunctions::ProhibitSleepViaSelect" Use Time::HiRes instead of something like \f(CW\*(C`select(undef, undef, undef, .05)\*(C'\fR. [Default severity 5] .SS BuiltinFunctions::ProhibitStringyEval .IX Subsection "BuiltinFunctions::ProhibitStringyEval" Write \f(CW\*(C`eval { my $foo; bar($foo) }\*(C'\fR instead of \f(CW\*(C`eval "my $foo; bar($foo);"\*(C'\fR. [Default severity 5] .SS BuiltinFunctions::ProhibitStringySplit .IX Subsection "BuiltinFunctions::ProhibitStringySplit" Write \f(CW\*(C`split /\-/, $string\*(C'\fR instead of \f(CW\*(C`split \*(Aq\-\*(Aq, $string\*(C'\fR. [Default severity 2] .SS BuiltinFunctions::ProhibitUniversalCan .IX Subsection "BuiltinFunctions::ProhibitUniversalCan" Write \f(CW\*(C`eval { $foo\->can($name) }\*(C'\fR instead of \f(CW\*(C`UNIVERSAL::can($foo, $name)\*(C'\fR. [Default severity 3] .SS BuiltinFunctions::ProhibitUniversalIsa .IX Subsection "BuiltinFunctions::ProhibitUniversalIsa" Write \f(CW\*(C`eval { $foo\->isa($pkg) }\*(C'\fR instead of \f(CW\*(C`UNIVERSAL::isa($foo, $pkg)\*(C'\fR. [Default severity 3] .SS BuiltinFunctions::ProhibitUselessTopic .IX Subsection "BuiltinFunctions::ProhibitUselessTopic" Don\*(Aqt pass \f(CW$_\fR to built\-in functions that assume it, or to most filetest operators. [Default severity 2] .SS BuiltinFunctions::ProhibitVoidGrep .IX Subsection "BuiltinFunctions::ProhibitVoidGrep" Don\*(Aqt use \f(CW\*(C`grep\*(C'\fR in void contexts. [Default severity 3] .SS BuiltinFunctions::ProhibitVoidMap .IX Subsection "BuiltinFunctions::ProhibitVoidMap" Don\*(Aqt use \f(CW\*(C`map\*(C'\fR in void contexts. [Default severity 3] .SS BuiltinFunctions::RequireBlockGrep .IX Subsection "BuiltinFunctions::RequireBlockGrep" Write \f(CW\*(C`grep { /$pattern/ } @list\*(C'\fR instead of \f(CW\*(C`grep /$pattern/, @list\*(C'\fR. [Default severity 4] .SS BuiltinFunctions::RequireBlockMap .IX Subsection "BuiltinFunctions::RequireBlockMap" Write \f(CW\*(C`map { /$pattern/ } @list\*(C'\fR instead of \f(CW\*(C`map /$pattern/, @list\*(C'\fR. [Default severity 4] .SS BuiltinFunctions::RequireGlobFunction .IX Subsection "BuiltinFunctions::RequireGlobFunction" Use \f(CW\*(C`glob q{*}\*(C'\fR instead of <*>. [Default severity 5] .SS BuiltinFunctions::RequireSimpleSortBlock .IX Subsection "BuiltinFunctions::RequireSimpleSortBlock" Sort blocks should have a single statement. [Default severity 3] .SS ClassHierarchies::ProhibitAutoloading .IX Subsection "ClassHierarchies::ProhibitAutoloading" AUTOLOAD methods should be avoided. [Default severity 3] .SS ClassHierarchies::ProhibitExplicitISA .IX Subsection "ClassHierarchies::ProhibitExplicitISA" Employ \f(CW\*(C`use parent\*(C'\fR instead of \f(CW@ISA\fR. [Default severity 3] .SS ClassHierarchies::ProhibitOneArgBless .IX Subsection "ClassHierarchies::ProhibitOneArgBless" Write \f(CW\*(C`bless {}, $class;\*(C'\fR instead of just \f(CW\*(C`bless {};\*(C'\fR. [Default severity 5] .SS CodeLayout::ProhibitHardTabs .IX Subsection "CodeLayout::ProhibitHardTabs" Use spaces instead of tabs. [Default severity 3] .SS CodeLayout::ProhibitParensWithBuiltins .IX Subsection "CodeLayout::ProhibitParensWithBuiltins" Write \f(CW\*(C`open $handle, $path\*(C'\fR instead of \f(CW\*(C`open($handle, $path)\*(C'\fR. [Default severity 1] .SS CodeLayout::ProhibitQuotedWordLists .IX Subsection "CodeLayout::ProhibitQuotedWordLists" Write \f(CW\*(C`qw(foo bar baz)\*(C'\fR instead of \f(CW\*(C`(\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq, \*(Aqbaz\*(Aq)\*(C'\fR. [Default severity 2] .SS CodeLayout::ProhibitTrailingWhitespace .IX Subsection "CodeLayout::ProhibitTrailingWhitespace" Don\*(Aqt use whitespace at the end of lines. [Default severity 1] .SS CodeLayout::RequireConsistentNewlines .IX Subsection "CodeLayout::RequireConsistentNewlines" Use the same newline through the source. [Default severity 4] .SS CodeLayout::RequireTidyCode .IX Subsection "CodeLayout::RequireTidyCode" Must run code through perltidy. [Default severity 1] .SS CodeLayout::RequireTrailingCommas .IX Subsection "CodeLayout::RequireTrailingCommas" Put a comma at the end of every multi\-line list declaration, including the last one. [Default severity 1] .SS ControlStructures::ProhibitCStyleForLoops .IX Subsection "ControlStructures::ProhibitCStyleForLoops" Write \f(CWfor(0..20)\fR instead of \f(CW\*(C`for($i=0; $i<=20; $i++)\*(C'\fR. [Default severity 2] .SS ControlStructures::ProhibitCascadingIfElse .IX Subsection "ControlStructures::ProhibitCascadingIfElse" Don\*(Aqt write long "if\-elsif\-elsif\-elsif\-elsif...else" chains. [Default severity 3] .SS ControlStructures::ProhibitDeepNests .IX Subsection "ControlStructures::ProhibitDeepNests" Don\*(Aqt write deeply nested loops and conditionals. [Default severity 3] .SS ControlStructures::ProhibitLabelsWithSpecialBlockNames .IX Subsection "ControlStructures::ProhibitLabelsWithSpecialBlockNames" Don\*(Aqt use labels that are the same as the special block names. [Default severity 4] .SS ControlStructures::ProhibitMutatingListFunctions .IX Subsection "ControlStructures::ProhibitMutatingListFunctions" Don\*(Aqt modify \f(CW$_\fR in list functions. [Default severity 5] .SS ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions .IX Subsection "ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions" Don\*(Aqt use operators like \f(CW\*(C`not\*(C'\fR, \f(CW\*(C`!~\*(C'\fR, and \f(CW\*(C`le\*(C'\fR within \f(CW\*(C`until\*(C'\fR and \f(CW\*(C`unless\*(C'\fR. [Default severity 3] .SS ControlStructures::ProhibitPostfixControls .IX Subsection "ControlStructures::ProhibitPostfixControls" Write \f(CW\*(C`if($condition){ do_something() }\*(C'\fR instead of \f(CW\*(C`do_something() if $condition\*(C'\fR. [Default severity 2] .SS ControlStructures::ProhibitUnlessBlocks .IX Subsection "ControlStructures::ProhibitUnlessBlocks" Write \f(CW\*(C`if(! $condition)\*(C'\fR instead of \f(CWunless($condition)\fR. [Default severity 2] .SS ControlStructures::ProhibitUnreachableCode .IX Subsection "ControlStructures::ProhibitUnreachableCode" Don\*(Aqt write code after an unconditional \f(CW\*(C`die, exit, or next\*(C'\fR. [Default severity 4] .SS ControlStructures::ProhibitUntilBlocks .IX Subsection "ControlStructures::ProhibitUntilBlocks" Write \f(CW\*(C`while(! $condition)\*(C'\fR instead of \f(CWuntil($condition)\fR. [Default severity 2] .SS ControlStructures::ProhibitYadaOperator .IX Subsection "ControlStructures::ProhibitYadaOperator" Never use \f(CW\*(C`...\*(C'\fR in production code. [Default severity 4] .SS Documentation::PodSpelling .IX Subsection "Documentation::PodSpelling" Check your spelling. [Default severity 1] .SS Documentation::RequirePackageMatchesPodName .IX Subsection "Documentation::RequirePackageMatchesPodName" The \f(CW\*(C`=head1 NAME\*(C'\fR section should match the package. [Default severity 1] .SS Documentation::RequirePodAtEnd .IX Subsection "Documentation::RequirePodAtEnd" All POD should be after \f(CW\*(C`_\|_END_\|_\*(C'\fR. [Default severity 1] .SS Documentation::RequirePodSections .IX Subsection "Documentation::RequirePodSections" Organize your POD into the customary sections. [Default severity 2] .SS ErrorHandling::RequireCarping .IX Subsection "ErrorHandling::RequireCarping" Use functions from Carp instead of \f(CW\*(C`warn\*(C'\fR or \f(CW\*(C`die\*(C'\fR. [Default severity 3] .SS ErrorHandling::RequireCheckingReturnValueOfEval .IX Subsection "ErrorHandling::RequireCheckingReturnValueOfEval" You can\*(Aqt depend upon the value of \f(CW$@\fR/\f(CW$EVAL_ERROR\fR to tell whether an \f(CW\*(C`eval\*(C'\fR failed. [Default severity 3] .SS InputOutput::ProhibitBacktickOperators .IX Subsection "InputOutput::ProhibitBacktickOperators" Discourage stuff like \f(CW\*(C`@files = \`ls $directory\`\*(C'\fR. [Default severity 3] .SS InputOutput::ProhibitBarewordDirHandles .IX Subsection "InputOutput::ProhibitBarewordDirHandles" Write \f(CW\*(C`opendir my $dh, $dirname;\*(C'\fR instead of \f(CW\*(C`opendir DH, $dirname;\*(C'\fR. [Default severity 5] .SS InputOutput::ProhibitBarewordFileHandles .IX Subsection "InputOutput::ProhibitBarewordFileHandles" Write \f(CW\*(C`open my $fh, q{<}, $filename;\*(C'\fR instead of \f(CW\*(C`open FH, q{<}, $filename;\*(C'\fR. [Default severity 5] .SS InputOutput::ProhibitExplicitStdin .IX Subsection "InputOutput::ProhibitExplicitStdin" Use "<>" or "" or a prompting module instead of "". [Default severity 4] .SS InputOutput::ProhibitInteractiveTest .IX Subsection "InputOutput::ProhibitInteractiveTest" Use \fBprompt()\fR instead of \-t. [Default severity 5] .SS InputOutput::ProhibitJoinedReadline .IX Subsection "InputOutput::ProhibitJoinedReadline" Use \f(CW\*(C`local $/ = undef\*(C'\fR or Path::Tiny instead of joined readline. [Default severity 3] .SS InputOutput::ProhibitOneArgSelect .IX Subsection "InputOutput::ProhibitOneArgSelect" Never write \f(CWselect($fh)\fR. [Default severity 4] .SS InputOutput::ProhibitReadlineInForLoop .IX Subsection "InputOutput::ProhibitReadlineInForLoop" Write \f(CW\*(C`while( $line = <> ){...}\*(C'\fR instead of \f(CW\*(C`for(<>){...}\*(C'\fR. [Default severity 4] .SS InputOutput::ProhibitTwoArgOpen .IX Subsection "InputOutput::ProhibitTwoArgOpen" Write \f(CW\*(C`open $fh, q{<}, $filename;\*(C'\fR instead of \f(CW\*(C`open $fh, "<$filename";\*(C'\fR. [Default severity 5] .SS InputOutput::RequireBracedFileHandleWithPrint .IX Subsection "InputOutput::RequireBracedFileHandleWithPrint" Write \f(CW\*(C`print {$FH} $foo, $bar;\*(C'\fR instead of \f(CW\*(C`print $FH $foo, $bar;\*(C'\fR. [Default severity 1] .SS InputOutput::RequireBriefOpen .IX Subsection "InputOutput::RequireBriefOpen" Close filehandles as soon as possible after opening them. [Default severity 4] .SS InputOutput::RequireCheckedClose .IX Subsection "InputOutput::RequireCheckedClose" Write \f(CW\*(C`my $error = close $fh;\*(C'\fR instead of \f(CW\*(C`close $fh;\*(C'\fR. [Default severity 2] .SS InputOutput::RequireCheckedOpen .IX Subsection "InputOutput::RequireCheckedOpen" Write \f(CW\*(C`my $error = open $fh, $mode, $filename;\*(C'\fR instead of \f(CW\*(C`open $fh, $mode, $filename;\*(C'\fR. [Default severity 3] .SS InputOutput::RequireCheckedSyscalls .IX Subsection "InputOutput::RequireCheckedSyscalls" Return value of flagged function ignored. [Default severity 1] .SS InputOutput::RequireEncodingWithUTF8Layer .IX Subsection "InputOutput::RequireEncodingWithUTF8Layer" Write \f(CW\*(C`open $fh, q{<:encoding(UTF\-8)}, $filename;\*(C'\fR instead of \f(CW\*(C`open $fh, q{<:utf8}, $filename;\*(C'\fR. [Default severity 5] .SS Miscellanea::ProhibitFormats .IX Subsection "Miscellanea::ProhibitFormats" Do not use \f(CW\*(C`format\*(C'\fR. [Default severity 3] .SS Miscellanea::ProhibitTies .IX Subsection "Miscellanea::ProhibitTies" Do not use \f(CW\*(C`tie\*(C'\fR. [Default severity 2] .SS Miscellanea::ProhibitUnrestrictedNoCritic .IX Subsection "Miscellanea::ProhibitUnrestrictedNoCritic" Forbid a bare \f(CW\*(C`## no critic\*(C'\fR [Default severity 3] .SS Miscellanea::ProhibitUselessNoCritic .IX Subsection "Miscellanea::ProhibitUselessNoCritic" Remove ineffective "## no critic" annotations. [Default severity 2] .SS Modules::ProhibitAutomaticExportation .IX Subsection "Modules::ProhibitAutomaticExportation" Export symbols via \f(CW@EXPORT_OK\fR or \f(CW%EXPORT_TAGS\fR instead of \f(CW@EXPORT\fR. [Default severity 4] .SS Modules::ProhibitConditionalUseStatements .IX Subsection "Modules::ProhibitConditionalUseStatements" Avoid putting conditional logic around compile\-time includes. [Default severity 3] .SS Modules::ProhibitEvilModules .IX Subsection "Modules::ProhibitEvilModules" Ban modules that aren\*(Aqt blessed by your shop. [Default severity 5] .SS Modules::ProhibitExcessMainComplexity .IX Subsection "Modules::ProhibitExcessMainComplexity" Minimize complexity in code that is \fBoutside\fR of subroutines. [Default severity 3] .SS Modules::ProhibitMultiplePackages .IX Subsection "Modules::ProhibitMultiplePackages" Put packages (especially subclasses) in separate files. [Default severity 4] .SS Modules::RequireBarewordIncludes .IX Subsection "Modules::RequireBarewordIncludes" Write \f(CW\*(C`require Module\*(C'\fR instead of \f(CW\*(C`require \*(AqModule.pm\*(Aq\*(C'\fR. [Default severity 5] .SS Modules::RequireEndWithOne .IX Subsection "Modules::RequireEndWithOne" End each module with an explicitly \f(CW\*(C`1;\*(C'\fR instead of some funky expression. [Default severity 4] .SS Modules::RequireExplicitPackage .IX Subsection "Modules::RequireExplicitPackage" Always make the \f(CW\*(C`package\*(C'\fR explicit. [Default severity 4] .SS Modules::RequireFilenameMatchesPackage .IX Subsection "Modules::RequireFilenameMatchesPackage" Package declaration must match filename. [Default severity 5] .SS Modules::RequireNoMatchVarsWithUseEnglish .IX Subsection "Modules::RequireNoMatchVarsWithUseEnglish" \&\f(CW\*(C`use English\*(C'\fR must be passed a \f(CW\*(C`\-no_match_vars\*(C'\fR argument. [Default severity 2] .SS Modules::RequireVersionVar .IX Subsection "Modules::RequireVersionVar" Give every module a \f(CW$VERSION\fR number. [Default severity 2] .SS NamingConventions::Capitalization .IX Subsection "NamingConventions::Capitalization" Distinguish different program components by case. [Default severity 1] .SS NamingConventions::ProhibitAmbiguousNames .IX Subsection "NamingConventions::ProhibitAmbiguousNames" Don\*(Aqt use vague variable or subroutine names like \*(Aqlast\*(Aq or \*(Aqrecord\*(Aq. [Default severity 3] .SS Objects::ProhibitIndirectSyntax .IX Subsection "Objects::ProhibitIndirectSyntax" Prohibit indirect object call syntax. [Default severity 4] .SS References::ProhibitDoubleSigils .IX Subsection "References::ProhibitDoubleSigils" Write \f(CW\*(C`@{ $array_ref }\*(C'\fR instead of \f(CW@$array_ref\fR. [Default severity 2] .SS RegularExpressions::ProhibitCaptureWithoutTest .IX Subsection "RegularExpressions::ProhibitCaptureWithoutTest" Capture variable used outside conditional. [Default severity 3] .SS RegularExpressions::ProhibitComplexRegexes .IX Subsection "RegularExpressions::ProhibitComplexRegexes" Split long regexps into smaller \f(CW\*(C`qr//\*(C'\fR chunks. [Default severity 3] .SS RegularExpressions::ProhibitEnumeratedClasses .IX Subsection "RegularExpressions::ProhibitEnumeratedClasses" Use named character classes instead of explicit character lists. [Default severity 1] .SS RegularExpressions::ProhibitEscapedMetacharacters .IX Subsection "RegularExpressions::ProhibitEscapedMetacharacters" Use character classes for literal meta\-characters instead of escapes. [Default severity 1] .SS RegularExpressions::ProhibitFixedStringMatches .IX Subsection "RegularExpressions::ProhibitFixedStringMatches" Use \f(CW\*(C`eq\*(C'\fR or hash instead of fixed\-pattern regexps. [Default severity 2] .SS RegularExpressions::ProhibitSingleCharAlternation .IX Subsection "RegularExpressions::ProhibitSingleCharAlternation" Use \f(CW\*(C`[abc]\*(C'\fR instead of \f(CW\*(C`a|b|c\*(C'\fR. [Default severity 1] .SS RegularExpressions::ProhibitUnusedCapture .IX Subsection "RegularExpressions::ProhibitUnusedCapture" Only use a capturing group if you plan to use the captured value. [Default severity 3] .SS RegularExpressions::ProhibitUnusualDelimiters .IX Subsection "RegularExpressions::ProhibitUnusualDelimiters" Use only \f(CW\*(C`//\*(C'\fR or \f(CW\*(C`{}\*(C'\fR to delimit regexps. [Default severity 1] .SS RegularExpressions::ProhibitUselessTopic .IX Subsection "RegularExpressions::ProhibitUselessTopic" Don\*(Aqt use \f(CW$_\fR to match against regexes. [Default severity 2] .SS RegularExpressions::RequireBracesForMultiline .IX Subsection "RegularExpressions::RequireBracesForMultiline" Use \f(CW\*(C`{\*(C'\fR and \f(CW\*(C`}\*(C'\fR to delimit multi\-line regexps. [Default severity 1] .SS RegularExpressions::RequireDotMatchAnything .IX Subsection "RegularExpressions::RequireDotMatchAnything" Always use the \f(CW\*(C`/s\*(C'\fR modifier with regular expressions. [Default severity 2] .SS RegularExpressions::RequireExtendedFormatting .IX Subsection "RegularExpressions::RequireExtendedFormatting" Always use the \f(CW\*(C`/x\*(C'\fR modifier with regular expressions. [Default severity 3] .SS RegularExpressions::RequireLineBoundaryMatching .IX Subsection "RegularExpressions::RequireLineBoundaryMatching" Always use the \f(CW\*(C`/m\*(C'\fR modifier with regular expressions. [Default severity 2] .SS Subroutines::ProhibitAmpersandSigils .IX Subsection "Subroutines::ProhibitAmpersandSigils" Don\*(Aqt call functions with a leading ampersand sigil. [Default severity 2] .SS Subroutines::ProhibitBuiltinHomonyms .IX Subsection "Subroutines::ProhibitBuiltinHomonyms" Don\*(Aqt declare your own \f(CW\*(C`open\*(C'\fR function. [Default severity 4] .SS Subroutines::ProhibitExcessComplexity .IX Subsection "Subroutines::ProhibitExcessComplexity" Minimize complexity by factoring code into smaller subroutines. [Default severity 3] .SS Subroutines::ProhibitExplicitReturnUndef .IX Subsection "Subroutines::ProhibitExplicitReturnUndef" Return failure with bare \f(CW\*(C`return\*(C'\fR instead of \f(CW\*(C`return undef\*(C'\fR. [Default severity 5] .SS Subroutines::ProhibitManyArgs .IX Subsection "Subroutines::ProhibitManyArgs" Too many arguments. [Default severity 3] .SS Subroutines::ProhibitNestedSubs .IX Subsection "Subroutines::ProhibitNestedSubs" \&\f(CW\*(C`sub never { sub correct {} }\*(C'\fR. [Default severity 5] .SS Subroutines::ProhibitReturnSort .IX Subsection "Subroutines::ProhibitReturnSort" Behavior of \f(CW\*(C`sort\*(C'\fR is not defined if called in scalar context. [Default severity 5] .SS Subroutines::ProhibitSubroutinePrototypes .IX Subsection "Subroutines::ProhibitSubroutinePrototypes" Don\*(Aqt write \f(CW\*(C`sub my_function (@@) {}\*(C'\fR. [Default severity 5] .SS Subroutines::ProhibitUnusedPrivateSubroutines .IX Subsection "Subroutines::ProhibitUnusedPrivateSubroutines" Prevent unused private subroutines. [Default severity 3] .SS Subroutines::ProtectPrivateSubs .IX Subsection "Subroutines::ProtectPrivateSubs" Prevent access to private subs in other packages. [Default severity 3] .SS Subroutines::RequireArgUnpacking .IX Subsection "Subroutines::RequireArgUnpacking" Always unpack \f(CW@_\fR first. [Default severity 4] .SS Subroutines::RequireFinalReturn .IX Subsection "Subroutines::RequireFinalReturn" End every path through a subroutine with an explicit \f(CW\*(C`return\*(C'\fR statement. [Default severity 4] .SS TestingAndDebugging::ProhibitNoStrict .IX Subsection "TestingAndDebugging::ProhibitNoStrict" Prohibit various flavors of \f(CW\*(C`no strict\*(C'\fR. [Default severity 5] .SS TestingAndDebugging::ProhibitNoWarnings .IX Subsection "TestingAndDebugging::ProhibitNoWarnings" Prohibit various flavors of \f(CW\*(C`no warnings\*(C'\fR. [Default severity 4] .SS TestingAndDebugging::ProhibitProlongedStrictureOverride .IX Subsection "TestingAndDebugging::ProhibitProlongedStrictureOverride" Don\*(Aqt turn off strict for large blocks of code. [Default severity 4] .SS TestingAndDebugging::RequireTestLabels .IX Subsection "TestingAndDebugging::RequireTestLabels" Tests should all have labels. [Default severity 3] .SS TestingAndDebugging::RequireUseStrict .IX Subsection "TestingAndDebugging::RequireUseStrict" Always \f(CW\*(C`use strict\*(C'\fR. [Default severity 5] .SS TestingAndDebugging::RequireUseWarnings .IX Subsection "TestingAndDebugging::RequireUseWarnings" Always \f(CW\*(C`use warnings\*(C'\fR. [Default severity 4] .SS ValuesAndExpressions::ProhibitCommaSeparatedStatements .IX Subsection "ValuesAndExpressions::ProhibitCommaSeparatedStatements" Don\*(Aqt use the comma operator as a statement separator. [Default severity 4] .SS ValuesAndExpressions::ProhibitComplexVersion .IX Subsection "ValuesAndExpressions::ProhibitComplexVersion" Prohibit version values from outside the module. [Default severity 3] .SS ValuesAndExpressions::ProhibitConstantPragma .IX Subsection "ValuesAndExpressions::ProhibitConstantPragma" Don\*(Aqt \f(CW\*(C`use constant FOO => 15\*(C'\fR. [Default severity 4] .SS ValuesAndExpressions::ProhibitEmptyQuotes .IX Subsection "ValuesAndExpressions::ProhibitEmptyQuotes" Write \f(CW\*(C`q{}\*(C'\fR instead of \f(CW\*(Aq\*(Aq\fR. [Default severity 2] .SS ValuesAndExpressions::ProhibitEscapedCharacters .IX Subsection "ValuesAndExpressions::ProhibitEscapedCharacters" Write \f(CW"\eN{DELETE}"\fR instead of \f(CW"\ex7F"\fR, etc. [Default severity 2] .SS ValuesAndExpressions::ProhibitImplicitNewlines .IX Subsection "ValuesAndExpressions::ProhibitImplicitNewlines" Use concatenation or HEREDOCs instead of literal line breaks in strings. [Default severity 3] .SS ValuesAndExpressions::ProhibitInterpolationOfLiterals .IX Subsection "ValuesAndExpressions::ProhibitInterpolationOfLiterals" Always use single quotes for literal strings. [Default severity 1] .SS ValuesAndExpressions::ProhibitLeadingZeros .IX Subsection "ValuesAndExpressions::ProhibitLeadingZeros" Write \f(CWoct(755)\fR instead of \f(CW0755\fR. [Default severity 5] .SS ValuesAndExpressions::ProhibitLongChainsOfMethodCalls .IX Subsection "ValuesAndExpressions::ProhibitLongChainsOfMethodCalls" Long chains of method calls indicate tightly coupled code. [Default severity 2] .SS ValuesAndExpressions::ProhibitMagicNumbers .IX Subsection "ValuesAndExpressions::ProhibitMagicNumbers" Don\*(Aqt use values that don\*(Aqt explain themselves. [Default severity 2] .SS ValuesAndExpressions::ProhibitMismatchedOperators .IX Subsection "ValuesAndExpressions::ProhibitMismatchedOperators" Don\*(Aqt mix numeric operators with string operands, or vice\-versa. [Default severity 3] .SS ValuesAndExpressions::ProhibitMixedBooleanOperators .IX Subsection "ValuesAndExpressions::ProhibitMixedBooleanOperators" Write \f(CW\*(C` !$foo && $bar || $baz \*(C'\fR instead of \f(CW\*(C` not $foo && $bar or $baz\*(C'\fR. [Default severity 4] .SS ValuesAndExpressions::ProhibitNoisyQuotes .IX Subsection "ValuesAndExpressions::ProhibitNoisyQuotes" Use \f(CW\*(C`q{}\*(C'\fR or \f(CW\*(C`qq{}\*(C'\fR instead of quotes for awkward\-looking strings. [Default severity 2] .SS ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters .IX Subsection "ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters" Don\*(Aqt use quotes (\f(CW\*(C`\*(Aq\*(C'\fR, \f(CW\*(C`"\*(C'\fR, \f(CW\*(C`\`\*(C'\fR) as delimiters for the quote\-like operators. [Default severity 3] .SS ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator .IX Subsection "ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator" Don\*(Aqt write \f(CW\*(C` print <<\*(Aq_\|_END_\|_\*(Aq \*(C'\fR. [Default severity 3] .SS ValuesAndExpressions::ProhibitVersionStrings .IX Subsection "ValuesAndExpressions::ProhibitVersionStrings" Don\*(Aqt use strings like \f(CW\*(C`v1.4\*(C'\fR or \f(CW1.4.5\fR when including other modules. [Default severity 3] .SS ValuesAndExpressions::RequireConstantVersion .IX Subsection "ValuesAndExpressions::RequireConstantVersion" Require \f(CW$VERSION\fR to be a constant rather than a computed value. [Default severity 2] .SS ValuesAndExpressions::RequireInterpolationOfMetachars .IX Subsection "ValuesAndExpressions::RequireInterpolationOfMetachars" Warns that you might have used single quotes when you really wanted double\-quotes. [Default severity 1] .SS ValuesAndExpressions::RequireNumberSeparators .IX Subsection "ValuesAndExpressions::RequireNumberSeparators" Write \f(CW\*(C` 141_234_397.0145 \*(C'\fR instead of \f(CW 141234397.0145 \fR. [Default severity 2] .SS ValuesAndExpressions::RequireQuotedHeredocTerminator .IX Subsection "ValuesAndExpressions::RequireQuotedHeredocTerminator" Write \f(CW\*(C` print <<\*(AqTHE_END\*(Aq \*(C'\fR or \f(CW\*(C` print <<"THE_END" \*(C'\fR. [Default severity 3] .SS ValuesAndExpressions::RequireUpperCaseHeredocTerminator .IX Subsection "ValuesAndExpressions::RequireUpperCaseHeredocTerminator" Write \f(CW\*(C` <<\*(AqTHE_END\*(Aq; \*(C'\fR instead of \f(CW\*(C` <<\*(AqtheEnd\*(Aq; \*(C'\fR. [Default severity 2] .SS Variables::ProhibitAugmentedAssignmentInDeclaration .IX Subsection "Variables::ProhibitAugmentedAssignmentInDeclaration" Do not write \f(CW\*(C` my $foo .= \*(Aqbar\*(Aq; \*(C'\fR. [Default severity 4] .SS Variables::ProhibitConditionalDeclarations .IX Subsection "Variables::ProhibitConditionalDeclarations" Do not write \f(CW\*(C` my $foo = $bar if $baz; \*(C'\fR. [Default severity 5] .SS Variables::ProhibitEvilVariables .IX Subsection "Variables::ProhibitEvilVariables" Ban variables that aren\*(Aqt blessed by your shop. [Default severity 5] .SS Variables::ProhibitLocalVars .IX Subsection "Variables::ProhibitLocalVars" Use \f(CW\*(C`my\*(C'\fR instead of \f(CW\*(C`local\*(C'\fR, except when you have to. [Default severity 2] .SS Variables::ProhibitMatchVars .IX Subsection "Variables::ProhibitMatchVars" Avoid \f(CW\*(C`$\`\*(C'\fR, \f(CW$&\fR, \f(CW\*(C`$\*(Aq\*(C'\fR and their English equivalents. [Default severity 4] .SS Variables::ProhibitPackageVars .IX Subsection "Variables::ProhibitPackageVars" Eliminate globals declared with \f(CW\*(C`our\*(C'\fR or \f(CW\*(C`use vars\*(C'\fR. [Default severity 3] .SS Variables::ProhibitPerl4PackageNames .IX Subsection "Variables::ProhibitPerl4PackageNames" Use double colon (::) to separate package name components instead of single quotes (\*(Aq). [Default severity 2] .SS Variables::ProhibitPunctuationVars .IX Subsection "Variables::ProhibitPunctuationVars" Write \f(CW$EVAL_ERROR\fR instead of \f(CW$@\fR. [Default severity 2] .SS Variables::ProhibitReusedNames .IX Subsection "Variables::ProhibitReusedNames" Do not reuse a variable name in a lexical scope [Default severity 3] .SS Variables::ProhibitUnusedVariables .IX Subsection "Variables::ProhibitUnusedVariables" Don\*(Aqt ask for storage you don\*(Aqt need. [Default severity 3] .SS Variables::ProtectPrivateVars .IX Subsection "Variables::ProtectPrivateVars" Prevent access to private vars in other packages. [Default severity 3] .SS Variables::RequireInitializationForLocalVars .IX Subsection "Variables::RequireInitializationForLocalVars" Write \f(CW\*(C`local $foo = $bar;\*(C'\fR instead of just \f(CW\*(C`local $foo;\*(C'\fR. [Default severity 3] .SS Variables::RequireLexicalLoopIterators .IX Subsection "Variables::RequireLexicalLoopIterators" Write \f(CW\*(C`for my $element (@list) {...}\*(C'\fR instead of \f(CW\*(C`for $element (@list) {...}\*(C'\fR. [Default severity 5] .SS Variables::RequireLocalizedPunctuationVars .IX Subsection "Variables::RequireLocalizedPunctuationVars" Magic variables should be assigned as "local". [Default severity 4] .SS Variables::RequireNegativeIndices .IX Subsection "Variables::RequireNegativeIndices" Negative array index should be used. [Default severity 4] .SH VERSION .IX Header "VERSION" This is part of Perl::Critic version 1.126. .SH AUTHOR .IX Header "AUTHOR" Jeffrey Ryan Thalhammer .SH COPYRIGHT .IX Header "COPYRIGHT" Copyright (c) 2005\-2011 Imaginative Software Systems. All rights reserved. .PP 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.