Come posso preimpostare il codice Perl generato da Perl?
-
03-07-2019 - |
Domanda
Ho un generatore di test scritto in Perl. Genera test che si collegano a un simulatore. Questi test sono essi stessi scritti in Perl e si connettono al simulatore tramite la sua API. Vorrei che il codice generato fosse leggibile dall'uomo, il che significa che mi piacerebbe che fosse correttamente indentato e formattato. C'è un buon modo per farlo?
Seguono i dettagli oppure puoi passare alla domanda effettiva di seguito.
Questo è un esempio:
my $basic = ABC
TRIGGER => DELAY(
NUM => 500,
),
)
BASIC
my $additional = STATE_IS(
STATE => DEF,
INDEX => 0,
),
ADDITIONAL
Vorrei che il comando ABC
fosse eseguito con un ritardo di 500 (le unità non sono rilevanti in questo momento) dopo aver chiamato & amp; event
, e il lo stato dell'indice 0 è DEF
. A volte vorrò anche aspettare gli indici 1, 2, 3 ecc ...
Per un solo indice mi piacerebbe vederlo nel mio test:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
),
)
Per due parti vorrei vedere:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 1,
),
),
),
)
Quindi sostanzialmente sto aggiungendo un blocco di:
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
per ciascun indice e il numero dell'indice cambia.
Ecco come lo sto facendo:
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
Ecco la vera domanda
Il problema qui è che il codice esce scarsamente rientrato. Vorrei eseguire il $ basic
risultante attraverso un prettifier come questo:
&prettify($basic, "perl");
Che lo formattarebbe bene secondo le migliori pratiche di Perl. C'è un buon modo per farlo?
Soluzione
Ho usato questo:
use Perl::Tidy;
sub Format {
my $source = shift;
my $result;
Perl::Tidy::perltidy(
source => \$source,
destination => \$result,
argv => [qw(-pbp -nst)]
);
return $result;
}
Altri suggerimenti
PerlTidy rende il tuo codice non solo ordinato, ma davvero bello. Puoi facilmente modificarlo secondo i tuoi standard di codifica locali.