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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top