如何使用Method :: Signatures使Perltidy工作?

时间:2010-10-09 06:33:54

标签: eclipse perl code-formatting method-signature perl-tidy

我正在使用EclipseEPIC结合来编写我的Perl代码。我将EPIC配置为使用Perltidy和“-pbp”(perl best practices样式)来格式化我的代码。

使用Method::Signatures'named parameters时效果不佳。例如,func (:$arg1, : $arg2)格式为func (: $arg1, : $arg2),产生错误。

此外,func关键字无法识别为sub,因此缩进错误。

this之前未回答的问题和this交叉发布的问题相关。

4 个答案:

答案 0 :(得分:4)

您可以使用前置和后置过滤器修改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 $_ }
);

答案 1 :(得分:3)

Perl :: Tidy / perltidy没有使用PPI,它比PPI早了大约9年( http://sourceforge.net/projects/perltidy/说已注册:2000-12-23)

答案 2 :(得分:2)

除非你让Perltidy在其大部分工作中使用PPI,否则你不能知道各种签名模块,例如MooseX::Method::SignaturesMethod::Signatures::Simple或{ {1}}。

一个合理的解决方法可能是不要在所有代码上运行Perltidy,而只是在你刚编写的块上并希望以某种方式格式化。这样,您可以轻松地在任何方法签名上跳过它,并让它只处理方法体。

答案 3 :(得分:1)

与此同时,CPAN上存在一个新模块,可以解决这个问题。 它被称为Perl::Tidy::Sweetened并提供脚本perltidier

它还使用了prefilter的{​​{1}}和postfilter个钩子,但您无需自行处理。