1

Subroutines::ProhibitExcessComplexityを有効にしてスクリプトから Perl 批評家を実行するにはどうすればよいですか? 私は次のことを試しましたが、複雑な 500 行以上のサブルーチンにフラグを立てていませんでした。私は持っていませ.perlcriticrcん(そこにあることも望んでいません)

use Perl::Critic;

run_critic('temp.pl');
exit;

sub run_critic {
    my $file   = shift;
    my $critic = Perl::Critic->new(
        -severity => 5,
        -policy   => 'Subroutines::ProhibitExcessComplexity',
        -verbose  => 5,
    );
    my @violations = $critic->critique($file);
    print @violations;
}

私のPerl::Criticバージョンは1.116

perl -MPerl::Critic -e 'print "$Perl::Critic::VERSION\n"'
1.116
4

3 に答える 3

2

読み込まれたポリシーを表示する

実際にロードされたポリシーを表示するには、 を使用しますPerl::Critic->policies

ポリシー()

このエンジンにロードされたすべての Policy オブジェクトへの参照を含むリストを返します。オブジェクトは、ロードされた順序になります。ポリシーを表示すると、追加されていないことがわかります。

目的のポリシーがリストに追加されていないことがわかります。

use strict;
use warnings;

use Perl::Critic;

run_critic($0);
exit;

sub run_critic {
    my $file   = shift;
    my $critic = Perl::Critic->new(
        -severity => 5,
        -policy   => 'Subroutines::ProhibitExcessComplexity',
        -verbose  => 5,
    );
    print $critic->policies();      # View loaded Policies

    my @violations = $critic->critique($file);
    print @violations;
}

出力:

BuiltinFunctions::ProhibitSleepViaSelect
BuiltinFunctions::ProhibitStringyEval
BuiltinFunctions::RequireGlobFunction
ClassHierarchies::ProhibitOneArgBless
ControlStructures::ProhibitMutatingListFunctions
InputOutput::ProhibitBarewordFileHandles
InputOutput::ProhibitInteractiveTest
InputOutput::ProhibitTwoArgOpen
InputOutput::RequireEncodingWithUTF8Layer
Modules::ProhibitEvilModules
Modules::RequireBarewordIncludes
Modules::RequireFilenameMatchesPackage
Subroutines::ProhibitExplicitReturnUndef       
Subroutines::ProhibitNestedSubs
Subroutines::ProhibitReturnSort
Subroutines::ProhibitSubroutinePrototypes
TestingAndDebugging::ProhibitNoStrict
TestingAndDebugging::RequireUseStrict
ValuesAndExpressions::ProhibitLeadingZeros
Variables::ProhibitConditionalDeclarations
Variables::RequireLexicalLoopIterators

適切な構成オプション:-include

問題は、Constructor オプション -policyが存在しないことです。

代わりに使用したい-include

-includestring のリストへの参照@PATTERNSです。他のすべての設定に関係なく、少なくとも 1 つに一致するポリシー モジュールm/$PATTERN/ixmsが常に読み込まれます。例えば:

したがって、コンストラクターを修正します。

    my $critic = Perl::Critic->new(
        -severity => 5,
        -include  => 'Subroutines::ProhibitExcessComplexity',
        -verbose  => 5,
    );

出力:

BuiltinFunctions::ProhibitSleepViaSelect
BuiltinFunctions::ProhibitStringyEval
BuiltinFunctions::RequireGlobFunction
ClassHierarchies::ProhibitOneArgBless
ControlStructures::ProhibitMutatingListFunctions
InputOutput::ProhibitBarewordFileHandles
InputOutput::ProhibitInteractiveTest
InputOutput::ProhibitTwoArgOpen
InputOutput::RequireEncodingWithUTF8Layer
Modules::ProhibitEvilModules
Modules::RequireBarewordIncludes
Modules::RequireFilenameMatchesPackage
Subroutines::ProhibitExcessComplexity           # <--- ta da
Subroutines::ProhibitExplicitReturnUndef
Subroutines::ProhibitNestedSubs
Subroutines::ProhibitReturnSort
Subroutines::ProhibitSubroutinePrototypes
TestingAndDebugging::ProhibitNoStrict
TestingAndDebugging::RequireUseStrict
ValuesAndExpressions::ProhibitLeadingZeros
Variables::ProhibitConditionalDeclarations
Variables::RequireLexicalLoopIterators
于 2014-10-22T20:00:42.923 に答える
1

perlcritic代わりにユーティリティを使用することをお勧めします。出力を色付けしたり、ポケットベルに送信したりするなどの素晴らしいことを行うことができます。次に、シェルスクリプト、エイリアス、バッククォート、またはsystem()呼び出しなど、好きなものでラップできます。

# Analyze with just the ProhibitExcessComplexity policy
perlcritic --single-policy=ProhibitExcessComplexity FILES_OR_DIRECTORIES

# Analyze with all severity 5 policies, plus ExcessComplexity
perlcritic --severity=5 --include=ProhibitExcessComplexity FILES_OR_DIRECTORIES
于 2014-12-09T04:50:36.007 に答える