Comment puis-je personnaliser le code Perl généré par Perl?
-
03-07-2019 - |
Question
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. J'aimerais que le code généré soit lisible par l'homme, ce qui veut dire qu'il sera correctement mis en retrait et formaté. Y a-t-il un bon moyen de le faire?
Les détails suivent ou vous pouvez passer à la question ci-dessous.
Ceci est un exemple:
my $basic = ABC
TRIGGER => DELAY(
NUM => 500,
),
)
BASIC
my $additional = STATE_IS(
STATE => DEF,
INDEX => 0,
),
ADDITIONAL
J'aimerais que la commande ABC
soit exécutée avec un délai de 500 secondes (les unités ne sont pas pertinentes pour le moment) après que j'appelle & amp; event
, et le l'état d'index 0 est DEF
. Parfois, je veux aussi attendre les indeces 1, 2, 3 etc ...
Pour un seul index, j'aimerais voir ceci dans mon test:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
),
)
Pour deux indices, j'aimerais 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 le numéro d'index change.
Voici 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
Voici la vraie question
Le problème ici est que le code est mal mis en retrait. Je voudrais exécuter le $ basic
résultant à travers un prétesteur comme ceci:
&prettify($basic, "perl");
Ce qui le formaterait bien selon les meilleures pratiques de Perl. Y a-t-il un bon moyen de le faire?
La solution
J'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;
}
Autres conseils
PerlTidy rend votre code non seulement soigné, mais vraiment magnifique. Vous pouvez facilement le modifier en fonction de vos normes de codage locales.