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

问题是构造函数选项 -policy不存在。

相反,您想使用-include

-include是对字符串列表的引用@PATTERNSm/$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

Subroutines::ProhibitExcessComplexity严重性为 3(从源代码中可以看出),但您使用的是 5。这意味着您只显示严重性 = 5 的违规行为。将 设置-severity为 1、2 或 3:

my $critic = Perl::Critic->new(-severity => 1);

另请注意,这-policy不是newPOD 中的选项;它被忽略了。

于 2014-10-22T19:31:17.097 回答
1

我建议改用该perlcritic实用程序。它可以做一些不错的事情,例如为输出着色或将其发送到寻呼机。然后你可以用 shell 脚本、别名或反引号、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 回答