6

我有一个用 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,
                ),
            ),
        )

对于两个indeces,我想看看:


    &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 的最佳实践很好地格式化它。有什么好的方法可以做到这一点吗?

4

2 回答 2

21

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

于 2009-04-30T13:04:12.543 回答
10

我用过这个:

use Perl::Tidy;
sub Format {
    my $source = shift;
    my $result;
    Perl::Tidy::perltidy(
        source      => \$source,
        destination => \$result,
        argv        => [qw(-pbp -nst)]
    );
    return $result;
}
于 2009-04-30T14:47:59.970 回答