如何美化由Perl生成的Perl代码?

6
我有一个用Perl编写的测试生成器。它生成连接到模拟器的测试。这些测试本身是用Perl编写的,并通过其API连接到模拟器。我希望生成的代码可读性好,这意味着我希望它被正确缩进和格式化。有没有好的方法来实现这一点?
下面是详细信息,或者您可以直接跳转到实际问题:

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

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

ADDITIONAL

当我调用&event时,我希望延迟500个单位(目前不涉及单位),并执行命令ABC,同时索引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

PerlTidy可以使您的代码不仅整洁,而且美观动人。您可以根据本地编码标准轻松调整它。


10

我已经使用了这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接