2010-10-09 2 views
12

Ich verwende Eclipse kombiniert mit EPIC, um meinen Perl-Code zu schreiben. Ich konfigurierte EPIC, um Perltidy mit "-pbp" (perl best practices Stil) zu verwenden, um meinen Code zu formatieren.Wie kann ich perltidy mit Method :: Signatures arbeiten?

Dies funktioniert nicht gut, wenn Method::Signatures 'named parameters verwendet wird. Zum Beispiel wird func (:$arg1, : $arg2) als func (: $arg1, : $arg2) formatiert, was einen Fehler ergibt.

Auch func Schlüsselwort wird nicht wie sub erkannt, so dass der Einzug falsch ist.

Bezogen auf this vorherige unbeantwortete Frage und this Querpfosten.

Antwort

2

Sie können nicht, es sei denn, Sie PPI machen, das ist das, was perltidy für die meisten seiner Arbeit nutzt, kennt die verschiedenen Signaturmodule wie MooseX::Method::Signatures, Method::Signatures::Simple oder Method::Signatures.

Eine angemessene Abhilfe könnte sein, nicht perltidy auf allen Ihren Code auszuführen, sondern nur auf den Brocken davon haben Sie gerade geschrieben und in irgendeiner Weise formatiert werden soll. Auf diese Weise können Sie die Ausführung von Methoden-Signaturen überspringen und stattdessen nur die Methoden-Bodies verarbeiten.

+0

Ich bin so gewohnt, 'Alt + Strg + F' (AutoFormat alle) und mag es. Ich werde wirklich traurig sein, es aufzugeben. –

+1

So würde ich. Obwohl, leider, die einzigen Alternativen, die ich sehen kann, sind 1) aufgeben automatisch Formatierung/alle/von Ihrem Code ohne Rücksicht, 2) Verzicht auf Teile der Methode Signaturen, oder 3) etwas Arbeit auf PPI . Deine Entscheidung. – rafl

+3

Perltidy verwendet kein PPI - es hat seinen eigenen Parser –

3

Perl :: Tidy/perltidy keinen Gebrauch von PPI machen, es früher PPI um etwa 9 Jahre ( http://sourceforge.net/projects/perltidy/ sagt Registriert: 2000.12.23)

+2

http://search.cpan.org/dist/Perl-Tidy/META.yml beweist, dass die aktuelle Version auch nicht nach PPI migriert wurde. – daxim

4

Sie können die PerlCritic Skript mit einem Pre ändern und Nachfilter Die changelog liefert das folgende Beispiel

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 wird nun method als sub zum Zwecke der Formatierung behandeln. Wir können das gleiche mit func machen. Ich änderte meine/usr/local/bin/PerlCritic mit func arbeiten wie folgt:

#!/usr/bin/perl 

eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}' 
    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 $_ } 
); 
+0

Das behebt das Schlüsselwort method. Sehen Sie diese PerlTidy [Unterklasse] (http://www.openswartz.com/2010/12/19/perltidy-and-method-happy-together/), um mit dem Methodensignaturproblem zu beheben, das das OP hervorgehoben hat. –

1

In der Zwischenzeit ein neues Modul auf CPAN existiert, die diese Probleme löst. Es heißt Perl::Tidy::Sweetened und bietet das Skript perltidier.

Es verwendet auch die prefilter und postfilter Hooks von Perl::Tidy, aber Sie müssen nicht auf sich allein aufpassen.

Verwandte Themen