2009-04-30 4 views
6

J'ai un générateur de test écrit en Perl. Il génère des tests qui se connectent à un simulateur. Ces tests sont eux-mêmes écrits en Perl et se connectent au simulateur via son API. Je voudrais que le code généré soit lisible par un humain, ce qui signifie que je voudrais qu'il soit correctement mis en retrait et formaté. Y a-t-il un bon moyen de le faire?Comment puis-je prétendre le code Perl généré par Perl?

Vous trouverez les détails ci-dessous ou vous pouvez passer à la question actuelle ci-dessous.

Voici un exemple:


my $basic = ABC 
     TRIGGER  => DELAY(
      NUM   => 500, 
      ), 
     ) 
BASIC 

my $additional = STATE_IS(
     STATE   => DEF, 
     INDEX   => 0, 
     ), 

ADDITIONAL 

Je voudrais la commande ABC à exécuter avec un retard de 500 (unités ne sont pas pertinentes tout à l'heure) après que j'appelle &event, et l'état de l'indice 0 est DEF. Parfois, je veux aussi attendre indeces 1, 2, 3 etc ...

Pour un seul indice que je voudrais voir dans mon test:


    &event(
     CMD   => ABC 
     TRIGGER  => DELAY(
      NUM   => 500, 
      TRIGGER  => STATE_IS(
       STATE   => DEF, 
       INDEX   => 0, 
       ), 
      ), 
     ) 

Pour deux indeces I » souhaitez voir


    &event(
     CMD   => ABC 
     TRIGGER  => DELAY(
      NUM   => 500, 
      TRIGGER  => STATE_IS(
       STATE   => DEF, 
       INDEX   => 0, 
       TRIGGER  => STATE_IS(
        STATE   => DEF, 
        INDEX   => 1, 
        ), 
       ), 
      ), 
     ) 

donc, fondamentalement, j'ajoute un bloc de:


      TRIGGER  => STATE_IS(
       STATE   => DEF, 
       INDEX   => 0, 
       ), 

pour chaque index, et les changements de numéro d'index.

Voilà comment je le fais:


for $i (0..$num_indeces) { 
    # update the index number 
    $additional =~ s/(INDEX\s*=>\s*)\d+,/$1 $i,/; 

    $basic =~ s/(
       (\),\s*) # capture sequences of), 
       +   # as many as possible 
       \)\s*  # end with) without a , 
}    )/$additional $1/sx; # replace with the additional data 

est ici la question réelle

Le problème ici est que le code sort mal en retrait. Je voudrais courir le $basic résultant par un prettifier comme celui-ci:

&prettify($basic, "perl"); 

qui formate gentiment selon les meilleures pratiques de Perl. Y a-t-il un bon moyen de le faire?

Répondre

10

Je l'ai utilisé ceci:

use Perl::Tidy; 
sub Format { 
    my $source = shift; 
    my $result; 
    Perl::Tidy::perltidy(
     source  => \$source, 
     destination => \$result, 
     argv  => [qw(-pbp -nst)] 
    ); 
    return $result; 
} 
21

PerlTidy rend votre code non seulement bien rangé, mais vraiment beau. Vous pouvez facilement le modifier en fonction de vos normes de codage locales.