Como posso embelezar código Perl gerado pelo Perl?
-
03-07-2019 - |
Pergunta
Eu tenho um gerador de teste escrito em Perl. Ele gera testes que se conectam a um simulador. Estes testes são-se escrito em Perl e conectar-se o simulador através de sua API. Gostaria que o código gerado para ser legível, o que significa que gostaria que ser devidamente recuadas e formatado. Existe uma boa maneira de fazê-lo?
Detalhes acompanhamento, ou você pode pular para a questão real abaixo.
Este é um exemplo:
my $basic = ABC
TRIGGER => DELAY(
NUM => 500,
),
)
BASIC
my $additional = STATE_IS(
STATE => DEF,
INDEX => 0,
),
ADDITIONAL
Eu gostaria que o ABC
comando a ser executado com um atraso de 500 (unidades não são relevantes neste momento) depois que eu chamo &event
, e o estado de índice 0 é DEF
. Às vezes eu também vai querer esperar por indeces 1, 2, 3 etc ...
Por apenas um índice Eu gostaria de ver isso no meu teste:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
),
)
Por dois indeces eu gostaria de ver:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 1,
),
),
),
)
Então, basicamente, eu estou adicionando um bloco de:
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
para cada índice, e as alterações no número índice.
Aqui está como eu estou fazendo isso:
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
Aqui está a questão real
O problema aqui é que o código sai mal recuada. Eu gostaria de executar o $basic
resultante através de um prettifier assim:
&prettify($basic, "perl");
Qual seria formatá-lo bem de acordo com as melhores práticas do Perl. Existe alguma boa maneira de fazer isso?
Solução
Eu tenho usado este:
use Perl::Tidy;
sub Format {
my $source = shift;
my $result;
Perl::Tidy::perltidy(
source => \$source,
destination => \$result,
argv => [qw(-pbp -nst)]
);
return $result;
}
Outras dicas
PerlTidy torna seu código não só arrumado, mas muito bonito. Você pode facilmente ajustá-lo de acordo com suas normas de codificação locais.