2010-10-09 9 views
12

Sto usando Eclipse combinato con EPIC per scrivere il mio codice Perl. Ho configurato EPIC per utilizzare Perltidy con "-pbp" (stile perl best practices) per formattare il mio codice.Come posso far funzionare perltidy con Method :: Signatures?

Questo non funziona bene quando si utilizza Method::Signatures 'named parameters. Ad esempio, func (:$arg1, : $arg2) è formattato come func (: $arg1, : $arg2) che produce un errore.

Inoltre, la parola chiave func non è riconosciuta come sub, quindi il rientro è errato.

Correlato a this precedente domanda senza risposta e this croce post.

risposta

2

Non è possibile, a meno che non si fanno PPI, che è quello che Perltidy utilizza per la maggior parte del suo lavoro, a conoscenza dei vari moduli di firma, come MooseX::Method::Signatures, Method::Signatures::Simple o Method::Signatures.

Una soluzione ragionevole potrebbe essere quella di non eseguire Perltidy su tutto il codice, ma solo sui pezzi di esso che hai appena scritto e che vuoi formattato in qualche modo. In questo modo puoi facilmente ignorarlo eseguendolo su qualsiasi firma di metodo e farlo processare solo i corpi del metodo.

+0

Sono così abituato a 'Alt + Ctrl + F' (autoformat all) e mi piace. Sarò davvero triste per rinunciarci. –

+1

Anch'io. Anche se, purtroppo, le uniche alternative che riesco a vedere sono 1) rinunciare alla formattazione automatica di/tutto/del codice senza considerazione, 2) rinunciare a parti di firme di metodo o 3) fare un po 'di lavoro su PPI . La tua scelta. – rafl

+3

perltidy NON usa PPI - ha il proprio parser –

3

Perl :: Tidy/Perltidy non fa uso di PPI, che precede PPI da circa 9 anni ( http://sourceforge.net/projects/perltidy/ dice Registrato: 2000/12/23)

+2

http://search.cpan.org/dist/Perl-Tidy/META.yml dimostra che anche la versione corrente non è stata migrata in PPI. – daxim

4

È possibile modificare lo script perlcritic con un pre e post filtro. Il changelog fornisce il seguente esempio

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 verrà ora trattare method come sub per scopi di formattazione. Possiamo fare lo stesso con func. Ho modificato il mio/usr/local/bin/perlcritic di lavorare con func come segue:

#!/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

Questo corregge la parola chiave method. Vedere questo PerlTidy [sottoclasse] (http://www.openswartz.com/2010/12/19/perltidy-and-method-happy-together/) per risolvere il problema con la firma del metodo evidenziato dall'OP. –

1

Nel frattempo un nuovo modulo esiste su CPAN che risolve questi problemi. Si chiama Perl::Tidy::Sweetened e offre lo script perltidier.

Utilizza anche i ganci prefilter e postfilter di Perl::Tidy, ma non è necessario occuparsene da soli.