¿Cómo puedo prettificar el código Perl generado por Perl?
-
03-07-2019 - |
Pregunta
Tengo un generador de prueba escrito en Perl. Genera pruebas que se conectan a un simulador. Estas pruebas se escriben en Perl y se conectan al simulador a través de su API. Me gustaría que el código generado sea legible para el ser humano, lo que significa que me gustaría que esté correctamente sangrado y formateado. ¿Hay una buena manera de hacerlo?
Los detalles siguen, o puede saltar a la pregunta real a continuación.
Este es un ejemplo:
my $basic = ABC
TRIGGER => DELAY(
NUM => 500,
),
)
BASIC
my $additional = STATE_IS(
STATE => DEF,
INDEX => 0,
),
ADDITIONAL
Me gustaría que el comando ABC
se ejecute con un retraso de 500 (las unidades no son relevantes ahora) después de que llame a & amp; evento
, y El estado del índice 0 es DEF
. A veces también querré esperar los índices 1, 2, 3, etc ...
Para un solo índice, me gustaría ver esto en mi prueba:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
),
)
Para dos indeces me gustaría ver:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 1,
),
),
),
)
Así que básicamente estoy agregando un bloque de:
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
para cada índice, y el número del índice cambia.
Así es como lo estoy haciendo:
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
Aquí está la pregunta real
El problema aquí es que el código está mal sangrado. Me gustaría ejecutar el $ basic
resultante a través de un prettifier como este:
&prettify($basic, "perl");
Lo formatearía muy bien de acuerdo con las mejores prácticas de Perl. ¿Hay alguna buena manera de hacer esto?
Solución
He usado esto:
use Perl::Tidy;
sub Format {
my $source = shift;
my $result;
Perl::Tidy::perltidy(
source => \$source,
destination => \$result,
argv => [qw(-pbp -nst)]
);
return $result;
}
Otros consejos
PerlTidy hace que su código no solo sea ordenado, sino también hermoso. Puede ajustarlo fácilmente de acuerdo con los estándares de codificación locales.