NAME
App::PerlCriticUtils - Command-line utilities related to Perl::Critic
VERSION
This document describes version 0.008 of App::PerlCriticUtils (from Perl distribution App-PerlCriticUtils), released on 2023-01-17.
SYNOPSIS
This distribution provides the following command-line utilities related to Perl::Critic:
FUNCTIONS
pcpcat
Usage:
pcpcat(
%args
) -> [
$status_code
,
$reason
,
$payload
, \
%result_meta
]
Print Perl::Critic policy module source code.
Examples:
Example #1:
pcpcat(
policies
=> [
"Variables/ProhibitMatchVars"
]);
This function is not exported.
Arguments ('*' denotes required arguments):
policies* => array[perl::modname]
(No description)
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
pcpdoc
Usage:
pcpdoc(
%args
) -> [
$status_code
,
$reason
,
$payload
, \
%result_meta
]
Show documentation of Perl::Critic policy module.
Examples:
Example #1:
pcpdoc(
policy
=>
"Variables/ProhibitMatchVars"
);
This function is not exported.
Arguments ('*' denotes required arguments):
policy* => perl::modname
(No description)
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
pcpgrep
Usage:
pcpgrep(
%args
) -> [
$status_code
,
$reason
,
$payload
, \
%result_meta
]
Grep from list of installed Perl::Critic policy module names (abstracts, ...).
Examples:
What's that policy that prohibits returning undef explicitly?:
pcpgrep(
query
=> [
"undef"
]);
Result:
[
200,
"OK"
,
[
{
name
=>
"BuiltinFunctions::ProhibitSleepViaSelect"
,
abstract
=>
"Use L<Time::HiRes|Time::HiRes> instead of something like C<select(undef, undef, undef, .05)>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, bugs"
,
default_severity
=> 5,
},
{
name
=>
"InputOutput::ProhibitJoinedReadline"
,
abstract
=>
"Use C<local \$/ = undef> or L<Path::Tiny|Path::Tiny> instead of joined readline."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, performance"
,
default_severity
=> 3,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"Subroutines::ProhibitExplicitReturnUndef"
,
abstract
=>
"Return failure with bare C<return> instead of C<return undef>."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
supported_parameters
=>
""
,
},
],
{
"table.fields"
=> [
"name"
,
"abstract"
] },
]
What's that policy that requires using strict?:
pcpgrep(
query
=> [
"req"
,
"strict"
]);
Result:
[
200,
"OK"
,
[
{
name
=>
"TestingAndDebugging::RequireUseStrict"
,
abstract
=>
"Always C<use strict>."
,
supported_parameters
=>
"equivalent_modules"
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrule, certrec"
,
applies_to
=>
"PPI::Document"
,
},
],
{
"table.fields"
=> [
"name"
,
"abstract"
] },
]
I can never remember the names of the policies, hence this utility. It's a convenience shortcut for:
% pcplist |
grep
SOMETHING
% pcplist -l |
grep
SOMETHING
Note that pcplist also can filter:
% pcplist
undef
% pcplist req strict
This function is not exported.
Arguments ('*' denotes required arguments):
ignore_case => bool (default: 1)
Defaults to true for convenience.
query* => array[str]
(No description)
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
pcpless
Usage:
pcpless(
%args
) -> [
$status_code
,
$reason
,
$payload
, \
%result_meta
]
Show Perl::Critic policy module source code with `less`.
Examples:
Example #1:
pcpless(
policy
=>
"Variables/ProhibitMatchVars"
);
This function is not exported.
Arguments ('*' denotes required arguments):
policy* => perl::modname
(No description)
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
pcplist
Usage:
pcplist(
%args
) -> [
$status_code
,
$reason
,
$payload
, \
%result_meta
]
List installed Perl::Critic policy modules.
Examples:
List installed policies:
pcplist();
Result:
[
200,
"OK"
,
[
"BuiltinFunctions::GrepWithSimpleValue"
,
"BuiltinFunctions::ProhibitBooleanGrep"
,
"BuiltinFunctions::ProhibitComplexMappings"
,
"BuiltinFunctions::ProhibitLvalueSubstr"
,
"BuiltinFunctions::ProhibitReverseSortBlock"
,
"BuiltinFunctions::ProhibitShiftRef"
,
"BuiltinFunctions::ProhibitSleepViaSelect"
,
"BuiltinFunctions::ProhibitStringyEval"
,
"BuiltinFunctions::ProhibitStringySplit"
,
"BuiltinFunctions::ProhibitUniversalCan"
,
"BuiltinFunctions::ProhibitUniversalIsa"
,
"BuiltinFunctions::ProhibitUselessTopic"
,
"BuiltinFunctions::ProhibitVoidGrep"
,
"BuiltinFunctions::ProhibitVoidMap"
,
"BuiltinFunctions::RequireBlockGrep"
,
"BuiltinFunctions::RequireBlockMap"
,
"BuiltinFunctions::RequireGlobFunction"
,
"BuiltinFunctions::RequireSimpleSortBlock"
,
"ClassHierarchies::ProhibitAutoloading"
,
"ClassHierarchies::ProhibitExplicitISA"
,
"ClassHierarchies::ProhibitOneArgBless"
,
"CodeLayout::ProhibitHardTabs"
,
"CodeLayout::ProhibitParensWithBuiltins"
,
"CodeLayout::ProhibitQuotedWordLists"
,
"CodeLayout::ProhibitTrailingWhitespace"
,
"CodeLayout::RequireConsistentNewlines"
,
"CodeLayout::RequireTidyCode"
,
"CodeLayout::RequireTrailingCommas"
,
"ControlStructures::ProhibitCStyleForLoops"
,
"ControlStructures::ProhibitCascadingIfElse"
,
"ControlStructures::ProhibitDeepNests"
,
"ControlStructures::ProhibitLabelsWithSpecialBlockNames"
,
"ControlStructures::ProhibitMutatingListFunctions"
,
"ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions"
,
"ControlStructures::ProhibitPostfixControls"
,
"ControlStructures::ProhibitUnlessBlocks"
,
"ControlStructures::ProhibitUnreachableCode"
,
"ControlStructures::ProhibitUntilBlocks"
,
"ControlStructures::ProhibitYadaOperator"
,
"Documentation::PodSpelling"
,
"Documentation::RequirePackageMatchesPodName"
,
"Documentation::RequirePodAtEnd"
,
"Documentation::RequirePodSections"
,
"ErrorHandling::RequireCarping"
,
"ErrorHandling::RequireCheckingReturnValueOfEval"
,
"InputOutput::ProhibitBacktickOperators"
,
"InputOutput::ProhibitBarewordFileHandles"
,
"InputOutput::ProhibitExplicitStdin"
,
"InputOutput::ProhibitInteractiveTest"
,
"InputOutput::ProhibitJoinedReadline"
,
"InputOutput::ProhibitOneArgSelect"
,
"InputOutput::ProhibitReadlineInForLoop"
,
"InputOutput::ProhibitTwoArgOpen"
,
"InputOutput::RequireBracedFileHandleWithPrint"
,
"InputOutput::RequireBriefOpen"
,
"InputOutput::RequireCheckedClose"
,
"InputOutput::RequireCheckedOpen"
,
"InputOutput::RequireCheckedSyscalls"
,
"InputOutput::RequireEncodingWithUTF8Layer"
,
"Miscellanea::ProhibitFormats"
,
"Miscellanea::ProhibitTies"
,
"Miscellanea::ProhibitUnrestrictedNoCritic"
,
"Miscellanea::ProhibitUselessNoCritic"
,
"Modules::ProhibitAutomaticExportation"
,
"Modules::ProhibitConditionalUseStatements"
,
"Modules::ProhibitEvilModules"
,
"Modules::ProhibitExcessMainComplexity"
,
"Modules::ProhibitMultiplePackages"
,
"Modules::RequireBarewordIncludes"
,
"Modules::RequireEndWithOne"
,
"Modules::RequireExplicitPackage"
,
"Modules::RequireFilenameMatchesPackage"
,
"Modules::RequireNoMatchVarsWithUseEnglish"
,
"Modules::RequireVersionVar"
,
"NamingConventions::Capitalization"
,
"NamingConventions::ProhibitAmbiguousNames"
,
"Objects::ProhibitIndirectSyntax"
,
"References::ProhibitDoubleSigils"
,
"RegularExpressions::ProhibitCaptureWithoutTest"
,
"RegularExpressions::ProhibitComplexRegexes"
,
"RegularExpressions::ProhibitEnumeratedClasses"
,
"RegularExpressions::ProhibitEscapedMetacharacters"
,
"RegularExpressions::ProhibitFixedStringMatches"
,
"RegularExpressions::ProhibitSingleCharAlternation"
,
"RegularExpressions::ProhibitUnusedCapture"
,
"RegularExpressions::ProhibitUnusualDelimiters"
,
"RegularExpressions::ProhibitUselessTopic"
,
"RegularExpressions::RequireBracesForMultiline"
,
"RegularExpressions::RequireDotMatchAnything"
,
"RegularExpressions::RequireExtendedFormatting"
,
"RegularExpressions::RequireLineBoundaryMatching"
,
"Subroutines::ProhibitAmpersandSigils"
,
"Subroutines::ProhibitBuiltinHomonyms"
,
"Subroutines::ProhibitExcessComplexity"
,
"Subroutines::ProhibitExplicitReturnUndef"
,
"Subroutines::ProhibitManyArgs"
,
"Subroutines::ProhibitNestedSubs"
,
"Subroutines::ProhibitReturnSort"
,
"Subroutines::ProhibitSubroutinePrototypes"
,
"Subroutines::ProhibitUnusedPrivateSubroutines"
,
"Subroutines::ProtectPrivateSubs"
,
"Subroutines::RequireArgUnpacking"
,
"Subroutines::RequireFinalReturn"
,
"TestingAndDebugging::ProhibitNoStrict"
,
"TestingAndDebugging::ProhibitNoWarnings"
,
"TestingAndDebugging::ProhibitProlongedStrictureOverride"
,
"TestingAndDebugging::RequireTestLabels"
,
"TestingAndDebugging::RequireUseStrict"
,
"TestingAndDebugging::RequireUseWarnings"
,
"ValuesAndExpressions::ProhibitCommaSeparatedStatements"
,
"ValuesAndExpressions::ProhibitComplexVersion"
,
"ValuesAndExpressions::ProhibitConstantPragma"
,
"ValuesAndExpressions::ProhibitEmptyQuotes"
,
"ValuesAndExpressions::ProhibitEscapedCharacters"
,
"ValuesAndExpressions::ProhibitImplicitNewlines"
,
"ValuesAndExpressions::ProhibitInterpolationOfLiterals"
,
"ValuesAndExpressions::ProhibitLeadingZeros"
,
"ValuesAndExpressions::ProhibitLongChainsOfMethodCalls"
,
"ValuesAndExpressions::ProhibitMagicNumbers"
,
"ValuesAndExpressions::ProhibitMismatchedOperators"
,
"ValuesAndExpressions::ProhibitMixedBooleanOperators"
,
"ValuesAndExpressions::ProhibitNoisyQuotes"
,
"ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters"
,
"ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator"
,
"ValuesAndExpressions::ProhibitVersionStrings"
,
"ValuesAndExpressions::RequireConstantVersion"
,
"ValuesAndExpressions::RequireInterpolationOfMetachars"
,
"ValuesAndExpressions::RequireNumberSeparators"
,
"ValuesAndExpressions::RequireQuotedHeredocTerminator"
,
"ValuesAndExpressions::RequireUpperCaseHeredocTerminator"
,
"Variables::ProhibitAugmentedAssignmentInDeclaration"
,
"Variables::ProhibitConditionalDeclarations"
,
"Variables::ProhibitEvilVariables"
,
"Variables::ProhibitFatCommaInDeclaration"
,
"Variables::ProhibitLocalVars"
,
"Variables::ProhibitMatchVars"
,
"Variables::ProhibitPackageVars"
,
"Variables::ProhibitPerl4PackageNames"
,
"Variables::ProhibitPunctuationVars"
,
"Variables::ProhibitReusedNames"
,
"Variables::ProhibitUnusedVariables"
,
"Variables::ProtectPrivateVars"
,
"Variables::RequireInitializationForLocalVars"
,
"Variables::RequireLexicalLoopIterators"
,
"Variables::RequireLocalizedPunctuationVars"
,
"Variables::RequireNegativeIndices"
,
],
{},
]
List installed policies (show details):
pcplist(
detail
=> 1);
Result:
[
200,
"OK"
,
[
{
name
=>
"BuiltinFunctions::GrepWithSimpleValue"
,
abstract
=>
"Warn grep with simple value"
,
supported_parameters
=>
""
,
default_severity
=> 3,
default_themes
=>
"core, bugs"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"BuiltinFunctions::ProhibitBooleanGrep"
,
abstract
=>
"Use C<List::MoreUtils::any> instead of C<grep> in boolean context."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 2,
default_themes
=>
"core, pbp, performance, certrec"
,
},
{
name
=>
"BuiltinFunctions::ProhibitComplexMappings"
,
abstract
=>
"Map blocks should have a single statement."
,
supported_parameters
=>
"max_statements"
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, maintenance, complexity"
,
default_severity
=> 3,
},
{
name
=>
"BuiltinFunctions::ProhibitLvalueSubstr"
,
abstract
=>
"Use 4-argument C<substr> instead of writing C<substr(\$foo, 2, 6) = \$bar>."
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, maintenance, pbp"
,
default_severity
=> 3,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::ProhibitReverseSortBlock"
,
abstract
=>
"Forbid \$b before \$a in sort blocks."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 1,
default_themes
=>
"core, pbp, cosmetic"
,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::ProhibitShiftRef"
,
abstract
=>
"Prohibit C<\\shift> in code"
,
default_themes
=>
"core, bugs, tests"
,
default_severity
=> 3,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::ProhibitSleepViaSelect"
,
abstract
=>
"Use L<Time::HiRes|Time::HiRes> instead of something like C<select(undef, undef, undef, .05)>."
,
supported_parameters
=>
""
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"BuiltinFunctions::ProhibitStringyEval"
,
abstract
=>
"Write C<eval { my \$foo; bar(\$foo) }> instead of C<eval \"my \$foo; bar(\$foo);\">."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrule"
,
supported_parameters
=>
"allow_includes"
,
},
{
name
=>
"BuiltinFunctions::ProhibitStringySplit"
,
abstract
=>
"Write C<split /-/, \$string> instead of C<split '-', \$string>."
,
default_severity
=> 2,
default_themes
=>
"core, pbp, cosmetic, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::ProhibitUniversalCan"
,
abstract
=>
"Write C<< eval { \$foo->can(\$name) } >> instead of C<UNIVERSAL::can(\$foo, \$name)>."
,
supported_parameters
=>
""
,
default_severity
=> 3,
default_themes
=>
"core, maintenance, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"BuiltinFunctions::ProhibitUniversalIsa"
,
abstract
=>
"Write C<< eval { \$foo->isa(\$pkg) } >> instead of C<UNIVERSAL::isa(\$foo, \$pkg)>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 3,
default_themes
=>
"core, maintenance, certrule"
,
},
{
name
=>
"BuiltinFunctions::ProhibitUselessTopic"
,
abstract
=>
"Don't pass \$_ to built-in functions that assume it, or to most filetest operators."
,
supported_parameters
=>
""
,
default_themes
=>
"core"
,
default_severity
=> 2,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"BuiltinFunctions::ProhibitVoidGrep"
,
abstract
=>
"Don't use C<grep> in void contexts."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, maintenance"
,
default_severity
=> 3,
},
{
name
=>
"BuiltinFunctions::ProhibitVoidMap"
,
abstract
=>
"Don't use C<map> in void contexts."
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, maintenance"
,
default_severity
=> 3,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::RequireBlockGrep"
,
abstract
=>
"Write C<grep { /\$pattern/ } \@list> instead of C<grep /\$pattern/, \@list>."
,
supported_parameters
=>
""
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"BuiltinFunctions::RequireBlockMap"
,
abstract
=>
"Write C<map { /\$pattern/ } \@list> instead of C<map /\$pattern/, \@list>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp"
,
},
{
name
=>
"BuiltinFunctions::RequireGlobFunction"
,
abstract
=>
"Use C<glob q{*}> instead of <*>."
,
applies_to
=>
"PPI::Token::QuoteLike::Readline"
,
default_themes
=>
"core, pbp, bugs"
,
default_severity
=> 5,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::RequireSimpleSortBlock"
,
abstract
=>
"Sort blocks should have a single statement."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 3,
default_themes
=>
"core, pbp, maintenance, complexity"
,
supported_parameters
=>
""
,
},
{
name
=>
"ClassHierarchies::ProhibitAutoloading"
,
abstract
=>
"AUTOLOAD methods should be avoided."
,
default_themes
=>
"core, maintenance, pbp"
,
default_severity
=> 3,
applies_to
=>
"PPI::Statement::Sub"
,
supported_parameters
=>
""
,
},
{
name
=>
"ClassHierarchies::ProhibitExplicitISA"
,
abstract
=>
"Employ C<use base> instead of C<\@ISA>."
,
supported_parameters
=>
""
,
default_severity
=> 3,
default_themes
=>
"core, maintenance, pbp, certrec"
,
applies_to
=>
"PPI::Token::Symbol"
,
},
{
name
=>
"ClassHierarchies::ProhibitOneArgBless"
,
abstract
=>
"Write C<bless {}, \$class;> instead of just C<bless {};>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, bugs"
,
default_severity
=> 5,
},
{
name
=>
"CodeLayout::ProhibitHardTabs"
,
abstract
=>
"Use spaces instead of tabs."
,
default_themes
=>
"core, cosmetic, pbp"
,
default_severity
=> 3,
applies_to
=>
"PPI::Token"
,
supported_parameters
=>
"allow_leading_tabs"
,
},
{
name
=>
"CodeLayout::ProhibitParensWithBuiltins"
,
abstract
=>
"Write C<open \$handle, \$path> instead of C<open(\$handle, \$path)>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 1,
default_themes
=>
"core, pbp, cosmetic"
,
},
{
name
=>
"CodeLayout::ProhibitQuotedWordLists"
,
abstract
=>
"Write C<qw(foo bar baz)> instead of C<('foo', 'bar', 'baz')>."
,
supported_parameters
=>
"min_elements, strict"
,
default_themes
=>
"core, cosmetic"
,
default_severity
=> 2,
applies_to
=>
"PPI::Structure::List"
,
},
{
name
=>
"CodeLayout::ProhibitTrailingWhitespace"
,
abstract
=>
"Don't use whitespace at the end of lines."
,
default_themes
=>
"core, maintenance"
,
default_severity
=> 1,
applies_to
=>
"PPI::Token::Whitespace"
,
supported_parameters
=>
""
,
},
{
name
=>
"CodeLayout::RequireConsistentNewlines"
,
abstract
=>
"Use the same newline through the source."
,
applies_to
=>
"PPI::Document"
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
supported_parameters
=>
""
,
},
{
name
=>
"CodeLayout::RequireTidyCode"
,
abstract
=>
"Must run code through L<perltidy|perltidy>."
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 1,
applies_to
=>
"PPI::Document"
,
supported_parameters
=>
"perltidyrc"
,
},
{
name
=>
"CodeLayout::RequireTrailingCommas"
,
abstract
=>
"Put a comma at the end of every multi-line list declaration, including the last one."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Structure::List"
,
default_severity
=> 1,
default_themes
=>
"core, pbp, cosmetic"
,
},
{
name
=>
"ControlStructures::ProhibitCStyleForLoops"
,
abstract
=>
"Write C<for(0..20)> instead of C<for(\$i=0; \$i<=20; \$i++)>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Structure::For"
,
default_severity
=> 2,
default_themes
=>
"core, pbp, maintenance"
,
},
{
name
=>
"ControlStructures::ProhibitCascadingIfElse"
,
abstract
=>
"Don't write long \"if-elsif-elsif-elsif-elsif...else\" chains."
,
supported_parameters
=>
"max_elsif"
,
applies_to
=>
"PPI::Statement::Compound"
,
default_severity
=> 3,
default_themes
=>
"core, pbp, maintenance, complexity"
,
},
{
name
=>
"ControlStructures::ProhibitDeepNests"
,
abstract
=>
"Don't write deeply nested loops and conditionals."
,
supported_parameters
=>
"max_nests"
,
applies_to
=>
"PPI::Statement::Compound"
,
default_severity
=> 3,
default_themes
=>
"core, maintenance, complexity"
,
},
{
name
=>
"ControlStructures::ProhibitLabelsWithSpecialBlockNames"
,
abstract
=>
"Don't use labels that are the same as the special block names."
,
applies_to
=>
"PPI::Token::Label"
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
supported_parameters
=>
""
,
},
{
name
=>
"ControlStructures::ProhibitMutatingListFunctions"
,
abstract
=>
"Don't modify C<\$_> in list functions."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 5,
default_themes
=>
"core, bugs, pbp, certrule"
,
supported_parameters
=>
"list_funcs, add_list_funcs"
,
},
{
name
=>
"ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions"
,
abstract
=>
"Don't use operators like C<not>, C<!~>, and C<le> within C<until> and C<unless>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, maintenance, pbp"
,
default_severity
=> 3,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"ControlStructures::ProhibitPostfixControls"
,
abstract
=>
"Write C<if(\$condition){ do_something() }> instead of C<do_something() if \$condition>."
,
supported_parameters
=>
"allow, flowcontrol"
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 2,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"ControlStructures::ProhibitUnlessBlocks"
,
abstract
=>
"Write C<if(! \$condition)> instead of C<unless(\$condition)>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 2,
applies_to
=>
"PPI::Statement::Compound"
,
},
{
name
=>
"ControlStructures::ProhibitUnreachableCode"
,
abstract
=>
"Don't write code after an unconditional C<die, exit, or next>."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 4,
default_themes
=>
"core, bugs, certrec"
,
supported_parameters
=>
""
,
},
{
name
=>
"ControlStructures::ProhibitUntilBlocks"
,
abstract
=>
"Write C<while(! \$condition)> instead of C<until(\$condition)>."
,
default_severity
=> 2,
default_themes
=>
"core, pbp, cosmetic"
,
applies_to
=>
"PPI::Statement"
,
supported_parameters
=>
""
,
},
{
name
=>
"ControlStructures::ProhibitYadaOperator"
,
abstract
=>
"Never use C<...> in production code."
,
applies_to
=>
"PPI::Token::Operator"
,
default_severity
=> 4,
default_themes
=>
"core, pbp, maintenance"
,
supported_parameters
=>
""
,
},
{
name
=>
"Documentation::PodSpelling"
,
abstract
=>
"Check your spelling."
,
supported_parameters
=>
"spell_command, stop_words, stop_words_file"
,
default_severity
=> 1,
default_themes
=>
"core, cosmetic, pbp"
,
applies_to
=>
"PPI::Document"
,
},
{
name
=>
"Documentation::RequirePackageMatchesPodName"
,
abstract
=>
"The C<=head1 NAME> section should match the package."
,
supported_parameters
=>
""
,
default_severity
=> 1,
default_themes
=>
"core, cosmetic"
,
applies_to
=>
"PPI::Document"
,
},
{
name
=>
"Documentation::RequirePodAtEnd"
,
abstract
=>
"All POD should be after C<__END__>."
,
applies_to
=>
"PPI::Document"
,
default_themes
=>
"core, cosmetic, pbp"
,
default_severity
=> 1,
supported_parameters
=>
""
,
},
{
name
=>
"Documentation::RequirePodSections"
,
abstract
=>
"Organize your POD into the customary sections."
,
supported_parameters
=>
"lib_sections, script_sections, source, language"
,
applies_to
=>
"PPI::Document"
,
default_severity
=> 2,
default_themes
=>
"core, pbp, maintenance"
,
},
{
name
=>
"ErrorHandling::RequireCarping"
,
abstract
=>
"Use functions from L<Carp|Carp> instead of C<warn> or C<die>."
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, maintenance, certrule"
,
default_severity
=> 3,
supported_parameters
=>
"allow_messages_ending_with_newlines, allow_in_main_unless_in_subroutine"
,
},
{
name
=>
"ErrorHandling::RequireCheckingReturnValueOfEval"
,
abstract
=>
"You can't depend upon the value of C<\$\@>/C<\$EVAL_ERROR> to tell whether an C<eval> failed."
,
supported_parameters
=>
""
,
default_severity
=> 3,
default_themes
=>
"core, bugs"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"InputOutput::ProhibitBacktickOperators"
,
abstract
=>
"Discourage stuff like C<\@files = `ls \$directory`>."
,
applies_to
=>
"PPI::Token::QuoteLike::Command"
,
default_themes
=>
"core, maintenance"
,
default_severity
=> 3,
supported_parameters
=>
"only_in_void_context"
,
},
{
name
=>
"InputOutput::ProhibitBarewordFileHandles"
,
abstract
=>
"Write C<open my \$fh, q{<}, \$filename;> instead of C<open FH, q{<}, \$filename;>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"InputOutput::ProhibitExplicitStdin"
,
abstract
=>
"Use \"<>\" or \"<ARGV>\" or a prompting module instead of \"<STDIN>\"."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::QuoteLike::Readline"
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 4,
},
{
name
=>
"InputOutput::ProhibitInteractiveTest"
,
abstract
=>
"Use prompt() instead of -t."
,
applies_to
=>
"PPI::Token::Operator"
,
default_themes
=>
"core, pbp, bugs, certrule"
,
default_severity
=> 5,
supported_parameters
=>
""
,
},
{
name
=>
"InputOutput::ProhibitJoinedReadline"
,
abstract
=>
"Use C<local \$/ = undef> or L<Path::Tiny|Path::Tiny> instead of joined readline."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, performance"
,
default_severity
=> 3,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"InputOutput::ProhibitOneArgSelect"
,
abstract
=>
"Never write C<select(\$fh)>."
,
default_themes
=>
"core, bugs, pbp, certrule"
,
default_severity
=> 4,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"InputOutput::ProhibitReadlineInForLoop"
,
abstract
=>
"Write C<< while( \$line = <> ){...} >> instead of C<< for(<>){...} >>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Compound"
,
default_themes
=>
"core, bugs, pbp"
,
default_severity
=> 4,
},
{
name
=>
"InputOutput::ProhibitTwoArgOpen"
,
abstract
=>
"Write C<< open \$fh, q{<}, \$filename; >> instead of C<< open \$fh, \"<\$filename\"; >>."
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, security, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"InputOutput::RequireBracedFileHandleWithPrint"
,
abstract
=>
"Write C<print {\$FH} \$foo, \$bar;> instead of C<print \$FH \$foo, \$bar;>."
,
supported_parameters
=>
""
,
default_severity
=> 1,
default_themes
=>
"core, pbp, cosmetic"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"InputOutput::RequireBriefOpen"
,
abstract
=>
"Close filehandles as soon as possible after opening them."
,
default_severity
=> 4,
default_themes
=>
"core, pbp, maintenance"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
"lines"
,
},
{
name
=>
"InputOutput::RequireCheckedClose"
,
abstract
=>
"Write C<< my \$error = close \$fh; >> instead of C<< close \$fh; >>."
,
default_themes
=>
"core, maintenance, certrule"
,
default_severity
=> 2,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
"autodie_modules"
,
},
{
name
=>
"InputOutput::RequireCheckedOpen"
,
abstract
=>
"Write C<< my \$error = open \$fh, \$mode, \$filename; >> instead of C<< open \$fh, \$mode, \$filename; >>."
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, maintenance, certrule"
,
default_severity
=> 3,
supported_parameters
=>
"autodie_modules"
,
},
{
name
=>
"InputOutput::RequireCheckedSyscalls"
,
abstract
=>
"Return value of flagged function ignored."
,
default_severity
=> 1,
default_themes
=>
"core, maintenance, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
"functions, exclude_functions, autodie_modules"
,
},
{
name
=>
"InputOutput::RequireEncodingWithUTF8Layer"
,
abstract
=>
"Write C<< open \$fh, q{<:encoding(UTF-8)}, \$filename; >> instead of C<< open \$fh, q{<:utf8}, \$filename; >>."
,
default_themes
=>
"core, bugs, security"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"Miscellanea::ProhibitFormats"
,
abstract
=>
"Do not use C<format>."
,
default_severity
=> 3,
default_themes
=>
"core, maintenance, pbp, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"Miscellanea::ProhibitTies"
,
abstract
=>
"Do not use C<tie>."
,
default_severity
=> 2,
default_themes
=>
"core, pbp, maintenance"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"Miscellanea::ProhibitUnrestrictedNoCritic"
,
abstract
=>
"Forbid a bare C<## no critic>"
,
applies_to
=>
"PPI::Document"
,
default_severity
=> 3,
default_themes
=>
"core, maintenance"
,
supported_parameters
=>
""
,
},
{
name
=>
"Miscellanea::ProhibitUselessNoCritic"
,
abstract
=>
"Remove ineffective \"## no critic\" annotations."
,
default_severity
=> 2,
default_themes
=>
"core, maintenance"
,
applies_to
=>
"PPI::Document"
,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::ProhibitAutomaticExportation"
,
abstract
=>
"Export symbols via C<\@EXPORT_OK> or C<%EXPORT_TAGS> instead of C<\@EXPORT>."
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
applies_to
=>
"PPI::Document"
,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::ProhibitConditionalUseStatements"
,
abstract
=>
"Avoid putting conditional logic around compile-time includes."
,
applies_to
=>
"PPI::Statement::Include"
,
default_themes
=>
"core, bugs"
,
default_severity
=> 3,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::ProhibitEvilModules"
,
abstract
=>
"Ban modules that aren't blessed by your shop."
,
default_themes
=>
"core, bugs, certrule"
,
default_severity
=> 5,
applies_to
=>
"PPI::Statement::Include"
,
supported_parameters
=>
"modules, modules_file"
,
},
{
name
=>
"Modules::ProhibitExcessMainComplexity"
,
abstract
=>
"Minimize complexity in code that is B<outside> of subroutines."
,
default_severity
=> 3,
default_themes
=>
"core, complexity, maintenance"
,
applies_to
=>
"PPI::Document"
,
supported_parameters
=>
"max_mccabe"
,
},
{
name
=>
"Modules::ProhibitMultiplePackages"
,
abstract
=>
"Put packages (especially subclasses) in separate files."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Document"
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
},
{
name
=>
"Modules::RequireBarewordIncludes"
,
abstract
=>
"Write C<require Module> instead of C<require 'Module.pm'>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Include"
,
default_themes
=>
"core, portability"
,
default_severity
=> 5,
},
{
name
=>
"Modules::RequireEndWithOne"
,
abstract
=>
"End each module with an explicitly C<1;> instead of some funky expression."
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp, certrule"
,
applies_to
=>
"PPI::Document"
,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::RequireExplicitPackage"
,
abstract
=>
"Always make the C<package> explicit."
,
default_themes
=>
"core, bugs"
,
default_severity
=> 4,
applies_to
=>
"PPI::Document"
,
supported_parameters
=>
"exempt_scripts, allow_import_of"
,
},
{
name
=>
"Modules::RequireFilenameMatchesPackage"
,
abstract
=>
"Package declaration must match filename."
,
default_severity
=> 5,
default_themes
=>
"core, bugs"
,
applies_to
=>
"PPI::Document"
,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::RequireNoMatchVarsWithUseEnglish"
,
abstract
=>
"C<use English> must be passed a C<-no_match_vars> argument."
,
applies_to
=>
"PPI::Statement::Include"
,
default_themes
=>
"core, performance"
,
default_severity
=> 2,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::RequireVersionVar"
,
abstract
=>
"Give every module a C<\$VERSION> number."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Document"
,
default_themes
=>
"core, pbp, readability"
,
default_severity
=> 2,
},
{
name
=>
"NamingConventions::Capitalization"
,
abstract
=>
"Distinguish different program components by case."
,
supported_parameters
=>
"packages, package_exemptions, subroutines, subroutine_exemptions, local_lexical_variables, local_lexical_variable_exemptions, scoped_lexical_variables, scoped_lexical_variable_exemptions, file_lexical_variables, file_lexical_variable_exemptions, global_variables, global_variable_exemptions, constants, constant_exemptions, labels, label_exemptions"
,
applies_to
=>
"PPI::Token::Label"
,
default_severity
=> 1,
default_themes
=>
"core, pbp, cosmetic"
,
},
{
name
=>
"NamingConventions::ProhibitAmbiguousNames"
,
abstract
=>
"Don't use vague variable or subroutine names like 'last' or 'record'."
,
applies_to
=>
"PPI::Statement::Variable"
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 3,
supported_parameters
=>
"forbid"
,
},
{
name
=>
"Objects::ProhibitIndirectSyntax"
,
abstract
=>
"Prohibit indirect object call syntax."
,
default_themes
=>
"core, pbp, maintenance, certrule"
,
default_severity
=> 4,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
"forbid"
,
},
{
name
=>
"References::ProhibitDoubleSigils"
,
abstract
=>
"Write C<\@{ \$array_ref }> instead of C<\@\$array_ref>."
,
applies_to
=>
"PPI::Token::Cast"
,
default_severity
=> 2,
default_themes
=>
"core, pbp, cosmetic"
,
supported_parameters
=>
""
,
},
{
name
=>
"RegularExpressions::ProhibitCaptureWithoutTest"
,
abstract
=>
"Capture variable used outside conditional."
,
applies_to
=>
"PPI::Token::Magic"
,
default_themes
=>
"core, pbp, maintenance, certrule"
,
default_severity
=> 3,
supported_parameters
=>
"exception_source"
,
},
{
name
=>
"RegularExpressions::ProhibitComplexRegexes"
,
abstract
=>
"Split long regexps into smaller C<qr//> chunks."
,
supported_parameters
=>
"max_characters"
,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 3,
},
{
name
=>
"RegularExpressions::ProhibitEnumeratedClasses"
,
abstract
=>
"Use named character classes instead of explicit character lists."
,
default_themes
=>
"core, pbp, cosmetic, unicode"
,
default_severity
=> 1,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
supported_parameters
=>
""
,
},
{
name
=>
"RegularExpressions::ProhibitEscapedMetacharacters"
,
abstract
=>
"Use character classes for literal meta-characters instead of escapes."
,
supported_parameters
=>
""
,
default_severity
=> 1,
default_themes
=>
"core, pbp, cosmetic"
,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
},
{
name
=>
"RegularExpressions::ProhibitFixedStringMatches"
,
abstract
=>
"Use C<eq> or hash instead of fixed-pattern regexps."
,
default_severity
=> 2,
default_themes
=>
"core, pbp, performance"
,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
supported_parameters
=>
""
,
},
{
name
=>
"RegularExpressions::ProhibitSingleCharAlternation"
,
abstract
=>
"Use C<[abc]> instead of C<a|b|c>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, performance"
,
default_severity
=> 1,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
},
{
name
=>
"RegularExpressions::ProhibitUnusedCapture"
,
abstract
=>
"Only use a capturing group if you plan to use the captured value."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Regexp::Substitute"
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 3,
},
{
name
=>
"RegularExpressions::ProhibitUnusualDelimiters"
,
abstract
=>
"Use only C<//> or C<{}> to delimit regexps."
,
supported_parameters
=>
"allow_all_brackets"
,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
default_severity
=> 1,
default_themes
=>
"core, pbp, cosmetic"
,
},
{
name
=>
"RegularExpressions::ProhibitUselessTopic"
,
abstract
=>
"Don't use \$_ to match against regexes."
,
applies_to
=>
"PPI::Token::Magic"
,
default_severity
=> 2,
default_themes
=>
"core"
,
supported_parameters
=>
""
,
},
{
name
=>
"RegularExpressions::RequireBracesForMultiline"
,
abstract
=>
"Use C<{> and C<}> to delimit multi-line regexps."
,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 1,
supported_parameters
=>
"allow_all_brackets"
,
},
{
name
=>
"RegularExpressions::RequireDotMatchAnything"
,
abstract
=>
"Always use the C</s> modifier with regular expressions."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 2,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
},
{
name
=>
"RegularExpressions::RequireExtendedFormatting"
,
abstract
=>
"Always use the C</x> modifier with regular expressions."
,
default_severity
=> 3,
default_themes
=>
"core, pbp, maintenance"
,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
supported_parameters
=>
"minimum_regex_length_to_complain_about, strict"
,
},
{
name
=>
"RegularExpressions::RequireLineBoundaryMatching"
,
abstract
=>
"Always use the C</m> modifier with regular expressions."
,
default_severity
=> 2,
default_themes
=>
"core, pbp, cosmetic"
,
applies_to
=>
"PPI::Token::QuoteLike::Regexp"
,
supported_parameters
=>
""
,
},
{
name
=>
"Subroutines::ProhibitAmpersandSigils"
,
abstract
=>
"Don't call functions with a leading ampersand sigil."
,
supported_parameters
=>
""
,
default_severity
=> 2,
default_themes
=>
"core, pbp, maintenance"
,
applies_to
=>
"PPI::Token::Symbol"
,
},
{
name
=>
"Subroutines::ProhibitBuiltinHomonyms"
,
abstract
=>
"Don't declare your own C<open> function."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Sub"
,
default_themes
=>
"core, bugs, pbp, certrule"
,
default_severity
=> 4,
},
{
name
=>
"Subroutines::ProhibitExcessComplexity"
,
abstract
=>
"Minimize complexity by factoring code into smaller subroutines."
,
applies_to
=>
"PPI::Statement::Sub"
,
default_severity
=> 3,
default_themes
=>
"core, complexity, maintenance"
,
supported_parameters
=>
"max_mccabe"
,
},
{
name
=>
"Subroutines::ProhibitExplicitReturnUndef"
,
abstract
=>
"Return failure with bare C<return> instead of C<return undef>."
,
supported_parameters
=>
""
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"Subroutines::ProhibitManyArgs"
,
abstract
=>
"Too many arguments."
,
supported_parameters
=>
"max_arguments, skip_object"
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 3,
applies_to
=>
"PPI::Statement::Sub"
,
},
{
name
=>
"Subroutines::ProhibitNestedSubs"
,
abstract
=>
"C<sub never { sub correct {} }>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Sub"
,
default_themes
=>
"core, bugs"
,
default_severity
=> 5,
},
{
name
=>
"Subroutines::ProhibitReturnSort"
,
abstract
=>
"Behavior of C<sort> is not defined if called in scalar context."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 5,
default_themes
=>
"core, bugs, certrule"
,
supported_parameters
=>
""
,
},
{
name
=>
"Subroutines::ProhibitSubroutinePrototypes"
,
abstract
=>
"Don't write C<sub my_function (\@\@) {}>."
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
applies_to
=>
"PPI::Statement::Sub"
,
supported_parameters
=>
""
,
},
{
name
=>
"Subroutines::ProhibitUnusedPrivateSubroutines"
,
abstract
=>
"Prevent unused private subroutines."
,
supported_parameters
=>
"private_name_regex, allow, skip_when_using, allow_name_regex"
,
default_themes
=>
"core, maintenance, certrec"
,
default_severity
=> 3,
applies_to
=>
"PPI::Statement::Sub"
,
},
{
name
=>
"Subroutines::ProtectPrivateSubs"
,
abstract
=>
"Prevent access to private subs in other packages."
,
default_severity
=> 3,
default_themes
=>
"core, maintenance, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
"private_name_regex, allow"
,
},
{
name
=>
"Subroutines::RequireArgUnpacking"
,
abstract
=>
"Always unpack C<\@_> first."
,
default_severity
=> 4,
default_themes
=>
"core, pbp, maintenance"
,
applies_to
=>
"PPI::Statement::Sub"
,
supported_parameters
=>
"short_subroutine_statements, allow_subscripts, allow_delegation_to"
,
},
{
name
=>
"Subroutines::RequireFinalReturn"
,
abstract
=>
"End every path through a subroutine with an explicit C<return> statement."
,
supported_parameters
=>
"terminal_funcs, terminal_methods"
,
applies_to
=>
"PPI::Statement::Sub"
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp, certrec"
,
},
{
name
=>
"TestingAndDebugging::ProhibitNoStrict"
,
abstract
=>
"Prohibit various flavors of C<no strict>."
,
supported_parameters
=>
"allow"
,
applies_to
=>
"PPI::Statement::Include"
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
},
{
name
=>
"TestingAndDebugging::ProhibitNoWarnings"
,
abstract
=>
"Prohibit various flavors of C<no warnings>."
,
supported_parameters
=>
"allow, allow_with_category_restriction"
,
default_themes
=>
"core, bugs, pbp, certrec"
,
default_severity
=> 4,
applies_to
=>
"PPI::Statement::Include"
,
},
{
name
=>
"TestingAndDebugging::ProhibitProlongedStrictureOverride"
,
abstract
=>
"Don't turn off strict for large blocks of code."
,
applies_to
=>
"PPI::Statement::Include"
,
default_severity
=> 4,
default_themes
=>
"core, pbp, bugs, certrec"
,
supported_parameters
=>
"statements"
,
},
{
name
=>
"TestingAndDebugging::RequireTestLabels"
,
abstract
=>
"Tests should all have labels."
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, maintenance, tests"
,
default_severity
=> 3,
supported_parameters
=>
"modules"
,
},
{
name
=>
"TestingAndDebugging::RequireUseStrict"
,
abstract
=>
"Always C<use strict>."
,
supported_parameters
=>
"equivalent_modules"
,
applies_to
=>
"PPI::Document"
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrule, certrec"
,
},
{
name
=>
"TestingAndDebugging::RequireUseWarnings"
,
abstract
=>
"Always C<use warnings>."
,
supported_parameters
=>
"equivalent_modules"
,
default_severity
=> 4,
default_themes
=>
"core, pbp, bugs, certrule"
,
applies_to
=>
"PPI::Document"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitCommaSeparatedStatements"
,
abstract
=>
"Don't use the comma operator as a statement separator."
,
supported_parameters
=>
"allow_last_statement_to_be_comma_separated_in_map_and_grep"
,
applies_to
=>
"PPI::Statement"
,
default_themes
=>
"core, bugs, pbp, certrule"
,
default_severity
=> 4,
},
{
name
=>
"ValuesAndExpressions::ProhibitComplexVersion"
,
abstract
=>
"Prohibit version values from outside the module."
,
supported_parameters
=>
"forbid_use_version"
,
default_themes
=>
"core, maintenance"
,
default_severity
=> 3,
applies_to
=>
"PPI::Token::Symbol"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitConstantPragma"
,
abstract
=>
"Don't C<< use constant FOO => 15 >>."
,
supported_parameters
=>
""
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp"
,
applies_to
=>
"PPI::Statement::Include"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitEmptyQuotes"
,
abstract
=>
"Write C<q{}> instead of C<''>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 2,
applies_to
=>
"PPI::Token::Quote"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitEscapedCharacters"
,
abstract
=>
"Write C<\"\\N{DELETE}\"> instead of C<\"\\x7F\">, etc."
,
applies_to
=>
"PPI::Token::Quote::Interpolate"
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 2,
supported_parameters
=>
""
,
},
{
name
=>
"ValuesAndExpressions::ProhibitImplicitNewlines"
,
abstract
=>
"Use concatenation or HEREDOCs instead of literal line breaks in strings."
,
supported_parameters
=>
""
,
default_severity
=> 3,
default_themes
=>
"core, pbp, cosmetic"
,
applies_to
=>
"PPI::Token::Quote"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitInterpolationOfLiterals"
,
abstract
=>
"Always use single quotes for literal strings."
,
applies_to
=>
"PPI::Token::Quote::Interpolate"
,
default_severity
=> 1,
default_themes
=>
"core, pbp, cosmetic"
,
supported_parameters
=>
"allow, allow_if_string_contains_single_quote"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitLeadingZeros"
,
abstract
=>
"Write C<oct(755)> instead of C<0755>."
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::Number::Octal"
,
supported_parameters
=>
"strict"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitLongChainsOfMethodCalls"
,
abstract
=>
"Long chains of method calls indicate tightly coupled code."
,
supported_parameters
=>
"max_chain_length"
,
default_themes
=>
"core, maintenance"
,
default_severity
=> 2,
applies_to
=>
"PPI::Statement"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitMagicNumbers"
,
abstract
=>
"Don't use values that don't explain themselves."
,
default_themes
=>
"core, maintenance, certrec"
,
default_severity
=> 2,
applies_to
=>
"PPI::Token::Number"
,
supported_parameters
=>
"allowed_values, allowed_types, allow_to_the_right_of_a_fat_comma, constant_creator_subroutines"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitMismatchedOperators"
,
abstract
=>
"Don't mix numeric operators with string operands, or vice-versa."
,
applies_to
=>
"PPI::Token::Operator"
,
default_severity
=> 3,
default_themes
=>
"core, bugs, certrule"
,
supported_parameters
=>
""
,
},
{
name
=>
"ValuesAndExpressions::ProhibitMixedBooleanOperators"
,
abstract
=>
"Write C< !\$foo && \$bar || \$baz > instead of C< not \$foo && \$bar or \$baz>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement"
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp, certrec"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitNoisyQuotes"
,
abstract
=>
"Use C<q{}> or C<qq{}> instead of quotes for awkward-looking strings."
,
applies_to
=>
"PPI::Token::Quote::Single"
,
default_severity
=> 2,
default_themes
=>
"core, pbp, cosmetic"
,
supported_parameters
=>
""
,
},
{
name
=>
"ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters"
,
abstract
=>
"Don't use quotes (C<'>, C<\">, C<`>) as delimiters for the quote-like operators."
,
applies_to
=>
"PPI::Token::Regexp::Transliterate"
,
default_themes
=>
"core, maintenance"
,
default_severity
=> 3,
supported_parameters
=>
"single_quote_allowed_operators, double_quote_allowed_operators, back_quote_allowed_operators"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator"
,
abstract
=>
"Don't write C< print <<'__END__' >."
,
supported_parameters
=>
""
,
default_severity
=> 3,
default_themes
=>
"core, maintenance"
,
applies_to
=>
"PPI::Token::HereDoc"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitVersionStrings"
,
abstract
=>
"Don't use strings like C<v1.4> or C<1.4.5> when including other modules."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 3,
applies_to
=>
"PPI::Statement::Include"
,
},
{
name
=>
"ValuesAndExpressions::RequireConstantVersion"
,
abstract
=>
"Require \$VERSION to be a constant rather than a computed value."
,
applies_to
=>
"PPI::Token::Symbol"
,
default_themes
=>
"core, maintenance"
,
default_severity
=> 2,
supported_parameters
=>
"allow_version_without_use_on_same_line"
,
},
{
name
=>
"ValuesAndExpressions::RequireInterpolationOfMetachars"
,
abstract
=>
"Warns that you might have used single quotes when you really wanted double-quotes."
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 1,
applies_to
=>
"PPI::Token::Quote::Literal"
,
supported_parameters
=>
"rcs_keywords"
,
},
{
name
=>
"ValuesAndExpressions::RequireNumberSeparators"
,
abstract
=>
"Write C< 141_234_397.0145 > instead of C< 141234397.0145 >."
,
supported_parameters
=>
"min_value"
,
default_severity
=> 2,
default_themes
=>
"core, pbp, cosmetic"
,
applies_to
=>
"PPI::Token::Number"
,
},
{
name
=>
"ValuesAndExpressions::RequireQuotedHeredocTerminator"
,
abstract
=>
"Write C< print <<'THE_END' > or C< print <<\"THE_END\" >."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::HereDoc"
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 3,
},
{
name
=>
"ValuesAndExpressions::RequireUpperCaseHeredocTerminator"
,
abstract
=>
"Write C< <<'THE_END'; > instead of C< <<'theEnd'; >."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::HereDoc"
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 2,
},
{
name
=>
"Variables::ProhibitAugmentedAssignmentInDeclaration"
,
abstract
=>
"Do not write C< my \$foo .= 'bar'; >."
,
applies_to
=>
"PPI::Statement::Variable"
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
supported_parameters
=>
""
,
},
{
name
=>
"Variables::ProhibitConditionalDeclarations"
,
abstract
=>
"Do not write C< my \$foo = \$bar if \$baz; >."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Variable"
,
default_themes
=>
"core, bugs"
,
default_severity
=> 5,
},
{
name
=>
"Variables::ProhibitEvilVariables"
,
abstract
=>
"Ban variables that aren't blessed by your shop."
,
default_severity
=> 5,
default_themes
=>
"core, bugs"
,
applies_to
=>
"PPI::Token::Symbol"
,
supported_parameters
=>
"variables, variables_file"
,
},
{
name
=>
"Variables::ProhibitFatCommaInDeclaration"
,
abstract
=>
"Prohibit fat comma in declaration"
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Variable"
,
default_themes
=>
"core, bugs"
,
default_severity
=> 4,
},
{
name
=>
"Variables::ProhibitLocalVars"
,
abstract
=>
"Use C<my> instead of C<local>, except when you have to."
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 2,
applies_to
=>
"PPI::Statement::Variable"
,
supported_parameters
=>
""
,
},
{
name
=>
"Variables::ProhibitMatchVars"
,
abstract
=>
"Avoid C<\$`>, C<\$&>, C<\$'> and their English equivalents."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Include"
,
default_severity
=> 4,
default_themes
=>
"core, performance, pbp"
,
},
{
name
=>
"Variables::ProhibitPackageVars"
,
abstract
=>
"Eliminate globals declared with C<our> or C<use vars>."
,
applies_to
=>
"PPI::Statement::Include"
,
default_severity
=> 3,
default_themes
=>
"core, pbp, maintenance"
,
supported_parameters
=>
"packages, add_packages"
,
},
{
name
=>
"Variables::ProhibitPerl4PackageNames"
,
abstract
=>
"Use double colon (::) to separate package name components instead of single quotes (')."
,
applies_to
=>
"PPI::Token::Symbol"
,
default_severity
=> 2,
default_themes
=>
"core, maintenance, certrec"
,
supported_parameters
=>
""
,
},
{
name
=>
"Variables::ProhibitPunctuationVars"
,
abstract
=>
"Write C<\$EVAL_ERROR> instead of C<\$\@>."
,
supported_parameters
=>
"allow, string_mode"
,
applies_to
=>
"PPI::Token::HereDoc"
,
default_themes
=>
"core, pbp, cosmetic"
,
default_severity
=> 2,
},
{
name
=>
"Variables::ProhibitReusedNames"
,
abstract
=>
"Do not reuse a variable name in a lexical scope"
,
applies_to
=>
"PPI::Statement::Variable"
,
default_themes
=>
"core, bugs"
,
default_severity
=> 3,
supported_parameters
=>
"allow"
,
},
{
name
=>
"Variables::ProhibitUnusedVariables"
,
abstract
=>
"Don't ask for storage you don't need."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Document"
,
default_severity
=> 3,
default_themes
=>
"core, maintenance, certrec"
,
},
{
name
=>
"Variables::ProtectPrivateVars"
,
abstract
=>
"Prevent access to private vars in other packages."
,
default_themes
=>
"core, maintenance, certrule"
,
default_severity
=> 3,
applies_to
=>
"PPI::Token::Symbol"
,
supported_parameters
=>
""
,
},
{
name
=>
"Variables::RequireInitializationForLocalVars"
,
abstract
=>
"Write C<local \$foo = \$bar;> instead of just C<local \$foo;>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 3,
applies_to
=>
"PPI::Statement::Variable"
,
},
{
name
=>
"Variables::RequireLexicalLoopIterators"
,
abstract
=>
"Write C<for my \$element (\@list) {...}> instead of C<for \$element (\@list) {...}>."
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
applies_to
=>
"PPI::Statement::Compound"
,
supported_parameters
=>
""
,
},
{
name
=>
"Variables::RequireLocalizedPunctuationVars"
,
abstract
=>
"Magic variables should be assigned as \"local\"."
,
default_severity
=> 4,
default_themes
=>
"core, pbp, bugs, certrec"
,
applies_to
=>
"PPI::Token::Operator"
,
supported_parameters
=>
"allow"
,
},
{
name
=>
"Variables::RequireNegativeIndices"
,
abstract
=>
"Negative array index should be used."
,
default_themes
=>
"core, maintenance, pbp"
,
default_severity
=> 4,
applies_to
=>
"PPI::Structure::Subscript"
,
supported_parameters
=>
""
,
},
],
{
"table.fields"
=> [
"name"
,
"abstract"
] },
]
What's that policy that prohibits returning undef explicitly?:
pcplist(
query
=> [
"undef"
]);
Result:
[
200,
"OK"
,
[
"BuiltinFunctions::ProhibitSleepViaSelect"
,
"InputOutput::ProhibitJoinedReadline"
,
"Subroutines::ProhibitExplicitReturnUndef"
,
],
{},
]
What's that policy that requires using strict?:
pcplist(
query
=> [
"req"
,
"strict"
]);
Result:
[200,
"OK"
, [
"TestingAndDebugging::RequireUseStrict"
], {}]
List policies which have default severity of 5:
pcplist(
default_severity
=> 5,
detail
=> 1);
Result:
[
200,
"OK"
,
[
{
name
=>
"BuiltinFunctions::ProhibitSleepViaSelect"
,
abstract
=>
"Use L<Time::HiRes|Time::HiRes> instead of something like C<select(undef, undef, undef, .05)>."
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::ProhibitStringyEval"
,
abstract
=>
"Write C<eval { my \$foo; bar(\$foo) }> instead of C<eval \"my \$foo; bar(\$foo);\">."
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
"allow_includes"
,
},
{
name
=>
"BuiltinFunctions::RequireGlobFunction"
,
abstract
=>
"Use C<glob q{*}> instead of <*>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::QuoteLike::Readline"
,
default_themes
=>
"core, pbp, bugs"
,
default_severity
=> 5,
},
{
name
=>
"ClassHierarchies::ProhibitOneArgBless"
,
abstract
=>
"Write C<bless {}, \$class;> instead of just C<bless {};>."
,
default_themes
=>
"core, pbp, bugs"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"ControlStructures::ProhibitMutatingListFunctions"
,
abstract
=>
"Don't modify C<\$_> in list functions."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 5,
default_themes
=>
"core, bugs, pbp, certrule"
,
supported_parameters
=>
"list_funcs, add_list_funcs"
,
},
{
name
=>
"InputOutput::ProhibitBarewordFileHandles"
,
abstract
=>
"Write C<open my \$fh, q{<}, \$filename;> instead of C<open FH, q{<}, \$filename;>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
},
{
name
=>
"InputOutput::ProhibitInteractiveTest"
,
abstract
=>
"Use prompt() instead of -t."
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrule"
,
applies_to
=>
"PPI::Token::Operator"
,
supported_parameters
=>
""
,
},
{
name
=>
"InputOutput::ProhibitTwoArgOpen"
,
abstract
=>
"Write C<< open \$fh, q{<}, \$filename; >> instead of C<< open \$fh, \"<\$filename\"; >>."
,
supported_parameters
=>
""
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, security, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"InputOutput::RequireEncodingWithUTF8Layer"
,
abstract
=>
"Write C<< open \$fh, q{<:encoding(UTF-8)}, \$filename; >> instead of C<< open \$fh, q{<:utf8}, \$filename; >>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, bugs, security"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"Modules::ProhibitEvilModules"
,
abstract
=>
"Ban modules that aren't blessed by your shop."
,
default_themes
=>
"core, bugs, certrule"
,
default_severity
=> 5,
applies_to
=>
"PPI::Statement::Include"
,
supported_parameters
=>
"modules, modules_file"
,
},
{
name
=>
"Modules::RequireBarewordIncludes"
,
abstract
=>
"Write C<require Module> instead of C<require 'Module.pm'>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Include"
,
default_themes
=>
"core, portability"
,
default_severity
=> 5,
},
{
name
=>
"Modules::RequireFilenameMatchesPackage"
,
abstract
=>
"Package declaration must match filename."
,
supported_parameters
=>
""
,
default_themes
=>
"core, bugs"
,
default_severity
=> 5,
applies_to
=>
"PPI::Document"
,
},
{
name
=>
"Subroutines::ProhibitExplicitReturnUndef"
,
abstract
=>
"Return failure with bare C<return> instead of C<return undef>."
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
supported_parameters
=>
""
,
},
{
name
=>
"Subroutines::ProhibitNestedSubs"
,
abstract
=>
"C<sub never { sub correct {} }>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Sub"
,
default_themes
=>
"core, bugs"
,
default_severity
=> 5,
},
{
name
=>
"Subroutines::ProhibitReturnSort"
,
abstract
=>
"Behavior of C<sort> is not defined if called in scalar context."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 5,
default_themes
=>
"core, bugs, certrule"
,
},
{
name
=>
"Subroutines::ProhibitSubroutinePrototypes"
,
abstract
=>
"Don't write C<sub my_function (\@\@) {}>."
,
supported_parameters
=>
""
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
applies_to
=>
"PPI::Statement::Sub"
,
},
{
name
=>
"TestingAndDebugging::ProhibitNoStrict"
,
abstract
=>
"Prohibit various flavors of C<no strict>."
,
supported_parameters
=>
"allow"
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
applies_to
=>
"PPI::Statement::Include"
,
},
{
name
=>
"TestingAndDebugging::RequireUseStrict"
,
abstract
=>
"Always C<use strict>."
,
supported_parameters
=>
"equivalent_modules"
,
applies_to
=>
"PPI::Document"
,
default_themes
=>
"core, pbp, bugs, certrule, certrec"
,
default_severity
=> 5,
},
{
name
=>
"ValuesAndExpressions::ProhibitLeadingZeros"
,
abstract
=>
"Write C<oct(755)> instead of C<0755>."
,
applies_to
=>
"PPI::Token::Number::Octal"
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
supported_parameters
=>
"strict"
,
},
{
name
=>
"Variables::ProhibitConditionalDeclarations"
,
abstract
=>
"Do not write C< my \$foo = \$bar if \$baz; >."
,
applies_to
=>
"PPI::Statement::Variable"
,
default_severity
=> 5,
default_themes
=>
"core, bugs"
,
supported_parameters
=>
""
,
},
{
name
=>
"Variables::ProhibitEvilVariables"
,
abstract
=>
"Ban variables that aren't blessed by your shop."
,
supported_parameters
=>
"variables, variables_file"
,
applies_to
=>
"PPI::Token::Symbol"
,
default_severity
=> 5,
default_themes
=>
"core, bugs"
,
},
{
name
=>
"Variables::RequireLexicalLoopIterators"
,
abstract
=>
"Write C<for my \$element (\@list) {...}> instead of C<for \$element (\@list) {...}>."
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
applies_to
=>
"PPI::Statement::Compound"
,
supported_parameters
=>
""
,
},
],
{
"table.fields"
=> [
"name"
,
"abstract"
] },
]
List policies which have default severity between 4 and 5:
pcplist(
detail
=> 1,
max_default_severity
=> 5,
min_default_severity
=> 4);
Result:
[
200,
"OK"
,
[
{
name
=>
"BuiltinFunctions::ProhibitSleepViaSelect"
,
abstract
=>
"Use L<Time::HiRes|Time::HiRes> instead of something like C<select(undef, undef, undef, .05)>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, bugs"
,
default_severity
=> 5,
},
{
name
=>
"BuiltinFunctions::ProhibitStringyEval"
,
abstract
=>
"Write C<eval { my \$foo; bar(\$foo) }> instead of C<eval \"my \$foo; bar(\$foo);\">."
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, bugs, certrule"
,
default_severity
=> 5,
supported_parameters
=>
"allow_includes"
,
},
{
name
=>
"BuiltinFunctions::RequireBlockGrep"
,
abstract
=>
"Write C<grep { /\$pattern/ } \@list> instead of C<grep /\$pattern/, \@list>."
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, bugs, pbp"
,
default_severity
=> 4,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::RequireBlockMap"
,
abstract
=>
"Write C<map { /\$pattern/ } \@list> instead of C<map /\$pattern/, \@list>."
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"BuiltinFunctions::RequireGlobFunction"
,
abstract
=>
"Use C<glob q{*}> instead of <*>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, pbp, bugs"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::QuoteLike::Readline"
,
},
{
name
=>
"ClassHierarchies::ProhibitOneArgBless"
,
abstract
=>
"Write C<bless {}, \$class;> instead of just C<bless {};>."
,
default_themes
=>
"core, pbp, bugs"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"CodeLayout::RequireConsistentNewlines"
,
abstract
=>
"Use the same newline through the source."
,
applies_to
=>
"PPI::Document"
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
supported_parameters
=>
""
,
},
{
name
=>
"ControlStructures::ProhibitLabelsWithSpecialBlockNames"
,
abstract
=>
"Don't use labels that are the same as the special block names."
,
supported_parameters
=>
""
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
applies_to
=>
"PPI::Token::Label"
,
},
{
name
=>
"ControlStructures::ProhibitMutatingListFunctions"
,
abstract
=>
"Don't modify C<\$_> in list functions."
,
supported_parameters
=>
"list_funcs, add_list_funcs"
,
default_themes
=>
"core, bugs, pbp, certrule"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"ControlStructures::ProhibitUnreachableCode"
,
abstract
=>
"Don't write code after an unconditional C<die, exit, or next>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_severity
=> 4,
default_themes
=>
"core, bugs, certrec"
,
},
{
name
=>
"ControlStructures::ProhibitYadaOperator"
,
abstract
=>
"Never use C<...> in production code."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Operator"
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 4,
},
{
name
=>
"InputOutput::ProhibitBarewordFileHandles"
,
abstract
=>
"Write C<open my \$fh, q{<}, \$filename;> instead of C<open FH, q{<}, \$filename;>."
,
supported_parameters
=>
""
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
applies_to
=>
"PPI::Token::Word"
,
},
{
name
=>
"InputOutput::ProhibitExplicitStdin"
,
abstract
=>
"Use \"<>\" or \"<ARGV>\" or a prompting module instead of \"<STDIN>\"."
,
default_severity
=> 4,
default_themes
=>
"core, pbp, maintenance"
,
applies_to
=>
"PPI::Token::QuoteLike::Readline"
,
supported_parameters
=>
""
,
},
{
name
=>
"InputOutput::ProhibitInteractiveTest"
,
abstract
=>
"Use prompt() instead of -t."
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrule"
,
applies_to
=>
"PPI::Token::Operator"
,
supported_parameters
=>
""
,
},
{
name
=>
"InputOutput::ProhibitOneArgSelect"
,
abstract
=>
"Never write C<select(\$fh)>."
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp, certrule"
,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"InputOutput::ProhibitReadlineInForLoop"
,
abstract
=>
"Write C<< while( \$line = <> ){...} >> instead of C<< for(<>){...} >>."
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp"
,
applies_to
=>
"PPI::Statement::Compound"
,
supported_parameters
=>
""
,
},
{
name
=>
"InputOutput::ProhibitTwoArgOpen"
,
abstract
=>
"Write C<< open \$fh, q{<}, \$filename; >> instead of C<< open \$fh, \"<\$filename\"; >>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, bugs, security, certrule"
,
default_severity
=> 5,
},
{
name
=>
"InputOutput::RequireBriefOpen"
,
abstract
=>
"Close filehandles as soon as possible after opening them."
,
supported_parameters
=>
"lines"
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, maintenance"
,
default_severity
=> 4,
},
{
name
=>
"InputOutput::RequireEncodingWithUTF8Layer"
,
abstract
=>
"Write C<< open \$fh, q{<:encoding(UTF-8)}, \$filename; >> instead of C<< open \$fh, q{<:utf8}, \$filename; >>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, bugs, security"
,
default_severity
=> 5,
},
{
name
=>
"Modules::ProhibitAutomaticExportation"
,
abstract
=>
"Export symbols via C<\@EXPORT_OK> or C<%EXPORT_TAGS> instead of C<\@EXPORT>."
,
applies_to
=>
"PPI::Document"
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::ProhibitEvilModules"
,
abstract
=>
"Ban modules that aren't blessed by your shop."
,
supported_parameters
=>
"modules, modules_file"
,
applies_to
=>
"PPI::Statement::Include"
,
default_themes
=>
"core, bugs, certrule"
,
default_severity
=> 5,
},
{
name
=>
"Modules::ProhibitMultiplePackages"
,
abstract
=>
"Put packages (especially subclasses) in separate files."
,
supported_parameters
=>
""
,
default_themes
=>
"core, bugs"
,
default_severity
=> 4,
applies_to
=>
"PPI::Document"
,
},
{
name
=>
"Modules::RequireBarewordIncludes"
,
abstract
=>
"Write C<require Module> instead of C<require 'Module.pm'>."
,
default_themes
=>
"core, portability"
,
default_severity
=> 5,
applies_to
=>
"PPI::Statement::Include"
,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::RequireEndWithOne"
,
abstract
=>
"End each module with an explicitly C<1;> instead of some funky expression."
,
applies_to
=>
"PPI::Document"
,
default_themes
=>
"core, bugs, pbp, certrule"
,
default_severity
=> 4,
supported_parameters
=>
""
,
},
{
name
=>
"Modules::RequireExplicitPackage"
,
abstract
=>
"Always make the C<package> explicit."
,
supported_parameters
=>
"exempt_scripts, allow_import_of"
,
applies_to
=>
"PPI::Document"
,
default_themes
=>
"core, bugs"
,
default_severity
=> 4,
},
{
name
=>
"Modules::RequireFilenameMatchesPackage"
,
abstract
=>
"Package declaration must match filename."
,
applies_to
=>
"PPI::Document"
,
default_themes
=>
"core, bugs"
,
default_severity
=> 5,
supported_parameters
=>
""
,
},
{
name
=>
"Objects::ProhibitIndirectSyntax"
,
abstract
=>
"Prohibit indirect object call syntax."
,
supported_parameters
=>
"forbid"
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, maintenance, certrule"
,
default_severity
=> 4,
},
{
name
=>
"Subroutines::ProhibitBuiltinHomonyms"
,
abstract
=>
"Don't declare your own C<open> function."
,
default_themes
=>
"core, bugs, pbp, certrule"
,
default_severity
=> 4,
applies_to
=>
"PPI::Statement::Sub"
,
supported_parameters
=>
""
,
},
{
name
=>
"Subroutines::ProhibitExplicitReturnUndef"
,
abstract
=>
"Return failure with bare C<return> instead of C<return undef>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Token::Word"
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
},
{
name
=>
"Subroutines::ProhibitNestedSubs"
,
abstract
=>
"C<sub never { sub correct {} }>."
,
applies_to
=>
"PPI::Statement::Sub"
,
default_severity
=> 5,
default_themes
=>
"core, bugs"
,
supported_parameters
=>
""
,
},
{
name
=>
"Subroutines::ProhibitReturnSort"
,
abstract
=>
"Behavior of C<sort> is not defined if called in scalar context."
,
default_themes
=>
"core, bugs, certrule"
,
default_severity
=> 5,
applies_to
=>
"PPI::Token::Word"
,
supported_parameters
=>
""
,
},
{
name
=>
"Subroutines::ProhibitSubroutinePrototypes"
,
abstract
=>
"Don't write C<sub my_function (\@\@) {}>."
,
applies_to
=>
"PPI::Statement::Sub"
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
supported_parameters
=>
""
,
},
{
name
=>
"Subroutines::RequireArgUnpacking"
,
abstract
=>
"Always unpack C<\@_> first."
,
applies_to
=>
"PPI::Statement::Sub"
,
default_severity
=> 4,
default_themes
=>
"core, pbp, maintenance"
,
supported_parameters
=>
"short_subroutine_statements, allow_subscripts, allow_delegation_to"
,
},
{
name
=>
"Subroutines::RequireFinalReturn"
,
abstract
=>
"End every path through a subroutine with an explicit C<return> statement."
,
supported_parameters
=>
"terminal_funcs, terminal_methods"
,
default_themes
=>
"core, bugs, pbp, certrec"
,
default_severity
=> 4,
applies_to
=>
"PPI::Statement::Sub"
,
},
{
name
=>
"TestingAndDebugging::ProhibitNoStrict"
,
abstract
=>
"Prohibit various flavors of C<no strict>."
,
default_themes
=>
"core, pbp, bugs, certrec"
,
default_severity
=> 5,
applies_to
=>
"PPI::Statement::Include"
,
supported_parameters
=>
"allow"
,
},
{
name
=>
"TestingAndDebugging::ProhibitNoWarnings"
,
abstract
=>
"Prohibit various flavors of C<no warnings>."
,
supported_parameters
=>
"allow, allow_with_category_restriction"
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp, certrec"
,
applies_to
=>
"PPI::Statement::Include"
,
},
{
name
=>
"TestingAndDebugging::ProhibitProlongedStrictureOverride"
,
abstract
=>
"Don't turn off strict for large blocks of code."
,
supported_parameters
=>
"statements"
,
default_severity
=> 4,
default_themes
=>
"core, pbp, bugs, certrec"
,
applies_to
=>
"PPI::Statement::Include"
,
},
{
name
=>
"TestingAndDebugging::RequireUseStrict"
,
abstract
=>
"Always C<use strict>."
,
default_themes
=>
"core, pbp, bugs, certrule, certrec"
,
default_severity
=> 5,
applies_to
=>
"PPI::Document"
,
supported_parameters
=>
"equivalent_modules"
,
},
{
name
=>
"TestingAndDebugging::RequireUseWarnings"
,
abstract
=>
"Always C<use warnings>."
,
applies_to
=>
"PPI::Document"
,
default_themes
=>
"core, pbp, bugs, certrule"
,
default_severity
=> 4,
supported_parameters
=>
"equivalent_modules"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitCommaSeparatedStatements"
,
abstract
=>
"Don't use the comma operator as a statement separator."
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp, certrule"
,
applies_to
=>
"PPI::Statement"
,
supported_parameters
=>
"allow_last_statement_to_be_comma_separated_in_map_and_grep"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitConstantPragma"
,
abstract
=>
"Don't C<< use constant FOO => 15 >>."
,
supported_parameters
=>
""
,
default_themes
=>
"core, bugs, pbp"
,
default_severity
=> 4,
applies_to
=>
"PPI::Statement::Include"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitLeadingZeros"
,
abstract
=>
"Write C<oct(755)> instead of C<0755>."
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
applies_to
=>
"PPI::Token::Number::Octal"
,
supported_parameters
=>
"strict"
,
},
{
name
=>
"ValuesAndExpressions::ProhibitMixedBooleanOperators"
,
abstract
=>
"Write C< !\$foo && \$bar || \$baz > instead of C< not \$foo && \$bar or \$baz>."
,
supported_parameters
=>
""
,
default_severity
=> 4,
default_themes
=>
"core, bugs, pbp, certrec"
,
applies_to
=>
"PPI::Statement"
,
},
{
name
=>
"Variables::ProhibitAugmentedAssignmentInDeclaration"
,
abstract
=>
"Do not write C< my \$foo .= 'bar'; >."
,
supported_parameters
=>
""
,
default_themes
=>
"core, bugs"
,
default_severity
=> 4,
applies_to
=>
"PPI::Statement::Variable"
,
},
{
name
=>
"Variables::ProhibitConditionalDeclarations"
,
abstract
=>
"Do not write C< my \$foo = \$bar if \$baz; >."
,
default_severity
=> 5,
default_themes
=>
"core, bugs"
,
applies_to
=>
"PPI::Statement::Variable"
,
supported_parameters
=>
""
,
},
{
name
=>
"Variables::ProhibitEvilVariables"
,
abstract
=>
"Ban variables that aren't blessed by your shop."
,
default_severity
=> 5,
default_themes
=>
"core, bugs"
,
applies_to
=>
"PPI::Token::Symbol"
,
supported_parameters
=>
"variables, variables_file"
,
},
{
name
=>
"Variables::ProhibitFatCommaInDeclaration"
,
abstract
=>
"Prohibit fat comma in declaration"
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Variable"
,
default_severity
=> 4,
default_themes
=>
"core, bugs"
,
},
{
name
=>
"Variables::ProhibitMatchVars"
,
abstract
=>
"Avoid C<\$`>, C<\$&>, C<\$'> and their English equivalents."
,
default_severity
=> 4,
default_themes
=>
"core, performance, pbp"
,
applies_to
=>
"PPI::Statement::Include"
,
supported_parameters
=>
""
,
},
{
name
=>
"Variables::RequireLexicalLoopIterators"
,
abstract
=>
"Write C<for my \$element (\@list) {...}> instead of C<for \$element (\@list) {...}>."
,
supported_parameters
=>
""
,
applies_to
=>
"PPI::Statement::Compound"
,
default_severity
=> 5,
default_themes
=>
"core, pbp, bugs, certrec"
,
},
{
name
=>
"Variables::RequireLocalizedPunctuationVars"
,
abstract
=>
"Magic variables should be assigned as \"local\"."
,
supported_parameters
=>
"allow"
,
default_severity
=> 4,
default_themes
=>
"core, pbp, bugs, certrec"
,
applies_to
=>
"PPI::Token::Operator"
,
},
{
name
=>
"Variables::RequireNegativeIndices"
,
abstract
=>
"Negative array index should be used."
,
default_themes
=>
"core, maintenance, pbp"
,
default_severity
=> 4,
applies_to
=>
"PPI::Structure::Subscript"
,
supported_parameters
=>
""
,
},
],
{
"table.fields"
=> [
"name"
,
"abstract"
] },
]
This function is not exported.
Arguments ('*' denotes required arguments):
default_severity => uint
(No description)
detail => bool
(No description)
max_default_severity => uint
(No description)
min_default_severity => uint
(No description)
query => array[str]
Filter by name.
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
pcpman
Usage:
pcpman(
%args
) -> [
$status_code
,
$reason
,
$payload
, \
%result_meta
]
Show manpage of Perl::Critic policy module.
Examples:
Example #1:
pcpman(
policy
=>
"Variables/ProhibitMatchVars"
);
This function is not exported.
Arguments ('*' denotes required arguments):
policy* => perl::modname
(No description)
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
pcppath
Usage:
pcppath(
%args
) -> [
$status_code
,
$reason
,
$payload
, \
%result_meta
]
Get path to locally installed Perl::Critic policy module.
Examples:
Example #1:
pcppath(
policies
=> [
"Variables/ProhibitMatchVars"
]);
Result:
[
200,
"OK"
,
[
"/home/u1/perl5/perlbrew/perls/perl-5.34.0/lib/site_perl/5.34.0/Perl/Critic/Policy/Variables/ProhibitMatchVars.pm"
,
],
{},
]
This function is not exported.
Arguments ('*' denotes required arguments):
policies* => array[perl::modname]
(No description)
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
HOMEPAGE
Please visit the project's homepage at https://metacpan.org/release/App-PerlCriticUtils.
SOURCE
Source repository is at https://github.com/perlancar/perl-App-PerlCriticUtils.
AUTHOR
perlancar <perlancar@cpan.org>
CONTRIBUTING
To contribute, you can send patches by email/via RT, or send pull requests on GitHub.
Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:
% prove -l
If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, Pod::Weaver::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla- and/or Pod::Weaver plugins. Any additional steps required beyond that are considered a bug and can be reported to me.
COPYRIGHT AND LICENSE
This software is copyright (c) 2023, 2022, 2021, 2018, 2017 by perlancar <perlancar@cpan.org>.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
BUGS
Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-PerlCriticUtils
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.