Как я могу сделать perltidy работу с Method:: Signatures?
Я использую Eclipse в сочетании с EPIC, чтобы написать код Perl. Я настроил EPIC для использования Perltidy с помощью "-pbp" (perl best practices) для форматирования моего кода.
Это не работает при использовании Method:: Signatures 'названные параметры. Например, func (:$arg1, : $arg2)
форматируется как func (: $arg1, : $arg2)
, что дает ошибку.
Кроме того, ключевое слово func
не распознается как sub
, поэтому отступ неверен.
Связано с этим предыдущим неотвеченным вопросом и этот перекрестный пост.
Ответы
Ответ 1
Вы можете изменить perlcritic script с помощью фильтра pre и post. changelog содержит следующий пример
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+"[email protected]"}'
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 $_ }
);
Ответ 2
Perl:: Tidy/perltidy не использует PPI, он предшествует PPI примерно на 9 лет (
http://sourceforge.net/projects/perltidy/ says Зарегистрирован: 2000-12-23)
Ответ 3
Вы не можете, если вы не сделаете PPI
, что Perltidy использует для большей части своей работы, известно о различных сигнатурных модулях, таких как MooseX::Method::Signatures
, Method::Signatures::Simple
или Method::Signatures
.
Разумным решением может быть не запуск Perltidy на весь ваш код, а только на его фрагменты, которые вы только что записали и хотите отформатировать каким-то образом. Таким образом, вы можете легко пропустить его на любых сигнатурах методов и заставить его обрабатывать только тела методов.
Ответ 4
Тем временем в CPAN существует новый модуль, который решает эти проблемы.
Он называется Perl::Tidy::Sweetened
и предлагает script perltidier
.
Он также использует крючки prefilter
и postfilter
Perl::Tidy
, но вам не нужно об этом позаботиться.