Как я могу заставить perltidy работать с Method :: Signatures? - PullRequest
12 голосов
/ 09 октября 2010

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

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

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

Относительно этого предыдущего вопроса без ответа и этого перекрестного сообщения.

Ответы [ 4 ]

4 голосов
/ 10 декабря 2011

Вы можете изменить сценарий perlcritic с предварительным и последующим фильтром. 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+"$@"}'
    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 $_ }
);
3 голосов
/ 11 октября 2010

Perl :: Tidy / perltidy не использует PPI, он предшествует PPI ​​примерно на 9 лет ( http://sourceforge.net/projects/perltidy/ говорит Зарегистрирован: 2000-12-23)

2 голосов
/ 09 октября 2010

Вы не можете, если не наберете PPI, который Perltidy использует для большей части своей работы, зная о различных модулях подписи, таких как MooseX::Method::Signatures, Method::Signatures::Simple или Method::Signatures.

Разумный обходной путь может заключаться в том, чтобы не запускать Perltidy для всего вашего кода, а только для тех его фрагментов, которые вы только что написали и хотите каким-то образом отформатировать. Таким образом, вы можете легко пропустить запуск его для любых сигнатур методов и заставить его обрабатывать только тела методов.

1 голос
/ 04 января 2017

Между тем в CPAN существует новый модуль, который решает эту проблему.Он называется Perl::Tidy::Sweetened и предлагает скрипт perltidier.

Он также использует prefilter и postfilter хуки Perl::Tidy, но вам не нужнопозаботься об этом сам.

...