12

我使用Eclipse结合EPIC来编写我的 Perl 代码。我将 EPIC 配置为使用带有“ -pbp ”(perl 最佳实践风格)的 Perltidy 来格式化我的代码。

这在使用Method::Signatures命名参数时效果不佳。例如,func (:$arg1, : $arg2)被格式化为func (: $arg1, : $arg2)产生错误。

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

先前未回答的问题和交叉帖子有关。

4

4 回答 4

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 $_ }
);
于 2011-12-10T07:58:03.077 回答
3

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

于 2010-10-11T10:02:09.493 回答
2

您不能,除非您制作PPI,这是 Perltidy 在其大部分工作中使用的,了解各种签名模块,例如MooseX::Method::SignaturesMethod::Signatures::SimpleMethod::Signatures.

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

于 2010-10-09T06:41:02.850 回答
1

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

它也使用prefilter和的postfilter钩子Perl::Tidy,但你不需要自己关心。

于 2017-01-04T12:51:34.470 回答