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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top