Как я могу заставить perltidy работать с Method::Signatures?
Я использую Eclipse в сочетании с EPIC для написания своего Perl-кода. Я настроил EPIC для использования Perltidy с "-pbp" (стиль лучших практик perl) для форматирования моего кода.
Это не работает при использовании именованных параметров Method::Signatures. Например, func (:$arg1, : $arg2)
отформатирован как func (: $arg1, : $arg2)
что приводит к ошибке.
Также, func
ключевое слово не распознается как sub
поэтому отступы неверны.
Связанный с этим предыдущим оставшимся без ответа вопросом и этим взаимным сообщением.
4 ответа
Вы можете изменить скрипт perlcritic с помощью предварительного и постфильтра. Список изменений содержит следующий пример
Perl::Tidy::perltidy(
prefilter => sub { $_ = $_[0]; s/^method (.*)/sub $1 \#__METHOD/gm; return $_ },
postfilter => sub { $_ = $_[0]; s/^sub (.*?)\s* \#__METHOD/method $1/gm; return $_ }
);
Perlcritic теперь будет лечить method
как sub
в целях форматирования. Мы можем сделать то же самое с func
, Я изменил мой /usr/local/bin/perlcritic для работы с func
следующее:
#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; # not running under some shell
package main;
use Perl::Tidy;
my $arg_string = undef;
# give Macs a chance to provide command line parameters
if ($^O =~ /Mac/) {
$arg_string =
MacPerl::Ask( 'Please enter @ARGV (-h for help)',
defined $ARGV[0] ? "\"$ARGV[0]\"" : "" );
}
Perl::Tidy::perltidy(
argv => $arg_string,
prefilter => sub { $_ = $_[0]; s/\W\Kfunc\((.*)/sub($1 \#__FUNC/gm; return $_ },
postfilter => sub { $_ = $_[0]; s/\W\Ksub\((.*?)\s* \#__FUNC/func($1/gm; return $_ }
);
Perl::Tidy/perltidy не использует PPI, он предшествует PPI примерно на 9 лет ( http://sourceforge.net/projects/perltidy/ говорит Registered: 2000-12-23)
Вы не можете, если вы не делаете PPI
Это то, что Perltidy использует для большей части своей работы, зная о различных сигнатурных модулях, таких как MooseX::Method::Signatures
, Method::Signatures::Simple
, или же Method::Signatures
,
Разумный обходной путь может заключаться в том, чтобы не запускать Perltidy для всего вашего кода, а только для фрагментов, которые вы только что написали и хотите каким-то образом отформатировать. Таким образом, вы можете легко пропустить запуск его для любых сигнатур методов и заставить его обрабатывать только тела методов.
Тем временем на CPAN существует новый модуль, который решает эту проблему. Это называется Perl::Tidy::Sweetened
и предлагает сценарий perltidier
,
Он также использует prefilter
а также postfilter
крючки Perl::Tidy
, но вам не нужно заботиться об этом самостоятельно.