我正在使用Eclipse与EPIC结合来编写我的Perl代码。我将EPIC配置为使用Perltidy和“-pbp”(perl best practices样式)来格式化我的代码。
使用Method::Signatures'named parameters时效果不佳。例如,func (:$arg1, : $arg2)
格式为func (: $arg1, : $arg2)
,产生错误。
此外,func
关键字无法识别为sub
,因此缩进错误。
答案 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::Signatures
,Method::Signatures::Simple
或{ {1}}。
一个合理的解决方法可能是不要在所有代码上运行Perltidy,而只是在你刚编写的块上并希望以某种方式格式化。这样,您可以轻松地在任何方法签名上跳过它,并让它只处理方法体。
答案 3 :(得分:1)
与此同时,CPAN上存在一个新模块,可以解决这个问题。
它被称为Perl::Tidy::Sweetened
并提供脚本perltidier
。
它还使用了prefilter
的{{1}}和postfilter
个钩子,但您无需自行处理。