Подтвердить что ты не робот

Как я могу сделать perltidy работу с Method:: Signatures?

Я использую Eclipse в сочетании с EPIC, чтобы написать код Perl. Я настроил EPIC для использования Perltidy с помощью "-pbp" (perl best practices) для форматирования моего кода.

Это не работает при использовании Method:: Signatures 'названные параметры. Например, func (:$arg1, : $arg2) форматируется как func (: $arg1, : $arg2), что дает ошибку.

Кроме того, ключевое слово func не распознается как sub, поэтому отступ неверен.

Связано с этим предыдущим неотвеченным вопросом и этот перекрестный пост.

4b9b3361

Ответ 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, но вам не нужно об этом позаботиться.