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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top