Как я могу предварительно оптимизировать код Perl, сгенерированный Perl? - PullRequest
6 голосов
/ 30 апреля 2009

У меня есть тестовый генератор, написанный на Perl. Он генерирует тесты, которые подключаются к симулятору. Эти тесты написаны на Perl и подключаются к симулятору через его API. Я хотел бы, чтобы сгенерированный код был удобочитаемым, а это значит, что я хотел бы, чтобы он был правильно вставлен в отступ и отформатирован. Есть ли хороший способ сделать это?

Подробности следуют, или вы можете перейти к актуальному вопросу ниже.

Это пример:


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

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

ADDITIONAL

Я бы хотел, чтобы команда ABC выполнялась с задержкой в ​​500 (единицы сейчас не актуальны) после того, как я вызову &event, а состояние индекса 0 равно DEF. Иногда я также хочу подождать 1, 2, 3 и т. Д. ...

Только для одного индекса я хотел бы видеть это в своем тесте:


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

Я бы хотел посмотреть на две вещи:


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

Так что в основном я добавляю блок:


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

для каждого индекса, и номер индекса изменяется.

Вот как я это делаю:


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

Вот актуальный вопрос

Проблема здесь в том, что код выходит с плохим отступом. Я хотел бы запустить получившийся $basic через преттификатор, например:

&prettify($basic, "perl");

Что бы правильно отформатировать его в соответствии с лучшими практиками Perl. Есть ли хороший способ сделать это?

Ответы [ 2 ]

21 голосов
/ 30 апреля 2009

PerlTidy делает ваш код не только аккуратным, но и действительно красивым. Вы можете легко настроить его в соответствии с вашими местными стандартами кодирования.

10 голосов
/ 30 апреля 2009

Я использовал это:

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