Как запустить Perl-критик из скрипта с включенной ProhibitExcessComplexity?

Как запустить Perl критик из скрипта с Subroutines::ProhibitExcessComplexity включен? Я попробовал следующее, но это не помечало сложные подпрограммы из 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

3 ответа

Решение

Просмотр загруженных политик

Для просмотра политик, которые действительно загружены, используйте Perl::Critic->policies,

политики ()

Возвращает список, содержащий ссылки на все объекты политики, которые были загружены в этот механизм. Объекты будут в том порядке, в котором они были загружены. Если вы просмотрите свою политику, вы увидите, что она не добавляется:

Вы увидите, что желаемая политика не добавлена ​​в список:

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:

-include ссылка на список строк @PATTERNS, Модули политики, соответствующие хотя бы одному 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

Subroutines::ProhibitExcessComplexity имеет серьезность 3 (как видно из исходного кода), но вы используете 5. Это означает, что вы показываете только нарушения серьезности =5. Установить -severity до 1, 2 или 3:

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

Также обратите внимание, что -policy не вариант для new в POD; это игнорируется.

Я бы порекомендовал использовать 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
Другие вопросы по тегам