Как запустить 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