Question

J'ai un générateur de test écrit en Perl. Il génère des tests qui se connectent à un simulateur. Ces tests sont eux-mêmes écrits en Perl et se connectent au simulateur via son API. J'aimerais que le code généré soit lisible par l'homme, ce qui veut dire qu'il sera correctement mis en retrait et formaté. Y a-t-il un bon moyen de le faire?

Les détails suivent ou vous pouvez passer à la question ci-dessous.

Ceci est un exemple:


my $basic =  ABC
        TRIGGER        => DELAY(
            NUM            => 500,
            ),
        )
BASIC

my $additional =  STATE_IS(
        STATE          => DEF,
        INDEX          => 0,
        ),

ADDITIONAL

J'aimerais que la commande ABC soit exécutée avec un délai de 500 secondes (les unités ne sont pas pertinentes pour le moment) après que j'appelle & amp; event , et le l'état d'index 0 est DEF . Parfois, je veux aussi attendre les indeces 1, 2, 3 etc ...

Pour un seul index, j'aimerais voir ceci dans mon test:


    &event(
        CMD            => ABC
        TRIGGER        => DELAY(
            NUM            => 500,
            TRIGGER        => STATE_IS(
                STATE          => DEF,
                INDEX          => 0,
                ),
            ),
        )

Pour deux indices, j'aimerais voir:


    &event(
        CMD            => ABC
        TRIGGER        => DELAY(
            NUM            => 500,
            TRIGGER        => STATE_IS(
                STATE          => DEF,
                INDEX          => 0,
                TRIGGER        => STATE_IS(
                    STATE          => DEF,
                    INDEX          => 1,
                    ),
                ),
            ),
        )

Donc, fondamentalement, j'ajoute un bloc de:


            TRIGGER        => STATE_IS(
                STATE          => DEF,
                INDEX          => 0,
                ),

pour chaque index et le numéro d'index change.

Voici comment je le fais:


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

Voici la vraie question

Le problème ici est que le code est mal mis en retrait. Je voudrais exécuter le $ basic résultant à travers un prétesteur comme ceci:

&prettify($basic, "perl");

Ce qui le formaterait bien selon les meilleures pratiques de Perl. Y a-t-il un bon moyen de le faire?

Était-ce utile?

La solution

J'ai utilisé ceci:

use Perl::Tidy;
sub Format {
    my $source = shift;
    my $result;
    Perl::Tidy::perltidy(
        source      => \$source,
        destination => \$result,
        argv        => [qw(-pbp -nst)]
    );
    return $result;
}

Autres conseils

PerlTidy rend votre code non seulement soigné, mais vraiment magnifique. Vous pouvez facilement le modifier en fonction de vos normes de codage locales.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top