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

时间:2009-04-30 12:50:18

标签: perl code-formatting

我有一个用Perl编写的测试生成器。它生成连接到模拟器的测试。这些测试本身是用Perl编写的,并通过其API连接到模拟器。我希望生成的代码是人类可读的,这意味着我希望它能够正确缩进和格式化。有没有好办法呢?

详情如下,或者您可以跳到下面的实际问题。

这是一个例子:


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

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

ADDITIONAL

我希望在调用ABC后,命令&event以500的延迟执行(单位现在不相关),并且索引0的状态为{{1 }}。有时我也想等待第1,2,3等等......

对于一个索引我想在我的测试中看到这个:

DEF

我希望看到两个版本:


    &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

根据Perl的最佳实践,它可以很好地格式化。有没有好办法呢?

2 个答案:

答案 0 :(得分:21)

PerlTidy使您的代码不仅整洁,而且非常漂亮。您可以根据当地的编码标准轻松调整它。

答案 1 :(得分:10)

我用过这个:

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