.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35) .\" .\" 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 .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . 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 .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Perl::Critic::PolicySummary 3pm" .TH Perl::Critic::PolicySummary 3pm "2020-05-17" "perl v5.30.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's book \fBPerl Best Practices\fR. Since most coding standards take the form \*(L"do this...\*(R" or \*(L"don't do that...\*(R", 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't 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`List::MoreUtils::any\*(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't 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't use \f(CW\*(C`grep\*(C'\fR in void contexts. [Default severity 3] .SS "BuiltinFunctions::ProhibitVoidMap" .IX Subsection "BuiltinFunctions::ProhibitVoidMap" Don't 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" \&\s-1AUTOLOAD\s0 methods should be avoided. [Default severity 3] .SS "ClassHierarchies::ProhibitExplicitISA" .IX Subsection "ClassHierarchies::ProhibitExplicitISA" Employ \f(CW\*(C`use base\*(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't 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(CW\*(C`for(0..20)\*(C'\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't write long \*(L"if\-elsif\-elsif\-elsif\-elsif...else\*(R" chains. [Default severity 3] .SS "ControlStructures::ProhibitDeepNests" .IX Subsection "ControlStructures::ProhibitDeepNests" Don't write deeply nested loops and conditionals. [Default severity 3] .SS "ControlStructures::ProhibitLabelsWithSpecialBlockNames" .IX Subsection "ControlStructures::ProhibitLabelsWithSpecialBlockNames" Don't use labels that are the same as the special block names. [Default severity 4] .SS "ControlStructures::ProhibitMutatingListFunctions" .IX Subsection "ControlStructures::ProhibitMutatingListFunctions" Don't modify \f(CW$_\fR in list functions. [Default severity 5] .SS "ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions" .IX Subsection "ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions" Don't 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(CW\*(C`unless($condition)\*(C'\fR. [Default severity 2] .SS "ControlStructures::ProhibitUnreachableCode" .IX Subsection "ControlStructures::ProhibitUnreachableCode" Don't 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(CW\*(C`until($condition)\*(C'\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 \s-1POD\s0 should be after \f(CW\*(C`_\|_END_\|_\*(C'\fR. [Default severity 1] .SS "Documentation::RequirePodSections" .IX Subsection "Documentation::RequirePodSections" Organize your \s-1POD\s0 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't 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::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 \*(L"<>\*(R" or \*(L"<\s-1ARGV\s0>\*(R" or a prompting module instead of \*(L"<\s-1STDIN\s0>\*(R". [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(CW\*(C`select($fh)\*(C'\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 \*(L"## no critic\*(R" 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't 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't use vague variable or subroutine names like 'last' or 'record'. [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't 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't call functions with a leading ampersand sigil. [Default severity 2] .SS "Subroutines::ProhibitBuiltinHomonyms" .IX Subsection "Subroutines::ProhibitBuiltinHomonyms" Don't 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't 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't 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't 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't \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(CW\*(C`oct(755)\*(C'\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't use values that don't explain themselves. [Default severity 2] .SS "ValuesAndExpressions::ProhibitMismatchedOperators" .IX Subsection "ValuesAndExpressions::ProhibitMismatchedOperators" Don't 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't 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't write \f(CW\*(C` print <<\*(Aq_\|_END_\|_\*(Aq \*(C'\fR. [Default severity 3] .SS "ValuesAndExpressions::ProhibitVersionStrings" .IX Subsection "ValuesAndExpressions::ProhibitVersionStrings" Don't 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't 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 ('). [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't ask for storage you don't 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 \*(L"local\*(R". [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 \s-1LICENSE\s0 file included with this module.