如何使 perltidy 与 Method::Signatures 一起工作?

发布于 2024-09-26 22:07:19 字数 1057 浏览 7 评论 0原文

我正在使用 EclipseEPIC 来编写我的 Perl 代码。我将 EPIC 配置为使用 Perltidy 和“-pbp”(Perltidy) sourceforge.net/perltidy.html#styles" rel="nofollow noreferrer">perl 最佳实践 风格)来格式化我的代码。

当使用 Method::Signatures' 命名参数。例如,func (:$arg1, : $arg2) 的格式为 func (: $arg1, : $arg2) ,这会产生错误。

另外,func 关键字不像 sub 那样被识别,因此缩进是错误的。

这个之前未回答的问题和交叉帖子。

I'm using Eclipse combined with EPIC to write my Perl code. I configured EPIC to use Perltidy with "-pbp" (perl best practices style) to format my code.

This doesn't work well when using Method::Signatures' named parameters. E.g., func (:$arg1, : $arg2) is formatted as func (: $arg1, : $arg2) which yields an error.

Also, func keyword is not recognized like sub so indentation is wrong.

Related to this previous unanswered question and this cross post.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

幽梦紫曦~ 2024-10-03 22:07:19

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

You can modify the perlcritic script with a pre and post filter. The changelog provides the following example

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 will now treat method as a sub for purposes of formatting. We can do the same with func. I modified my /usr/local/bin/perlcritic to work with func as follows:

#!/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 $_ }
);
倾城°AllureLove 2024-10-03 22:07:19

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

Perl::Tidy/perltidy does not make use of PPI, it predates PPI by about 9 years (
http://sourceforge.net/projects/perltidy/ says Registered: 2000-12-23 )

游魂 2024-10-03 22:07:19

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

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

You can't, unless you make PPI, which is what Perltidy uses for most of its work, aware of the various signature modules such as MooseX::Method::Signatures, Method::Signatures::Simple, or Method::Signatures.

A reasonable workaround might be to not run Perltidy on all of your code, but only on the chunks of it you've just written and want formatted in some way. That way you can easily skip running it on any method signatures and have it process only the method bodies instead.

梦在夏天 2024-10-03 22:07:19

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

它还使用 Perl::Tidyprefilterpostfilter 挂钩,但您不需要自己关心这些。

In the meantime a new module exists on CPAN which solves this problems.
It is called Perl::Tidy::Sweetened and offers the script perltidier.

It also uses the prefilter and postfilter hooks of Perl::Tidy, but you do not need to take care about that on your own.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文