Wie kann ich prettify Perl-code generiert von Perl?
-
03-07-2019 - |
Frage
Ich habe einen test-generator in Perl geschrieben.Es tests generiert, die eine Verbindung zu einem simulator.Diese tests sind selbst in Perl geschrieben und schließen Sie den simulator über die API.Ich möchte den generierten code zu sein, die für Menschen lesbar, das heißt, ich möchte es für richtig eingerückt und formatiert werden.Ist es ein guter Weg, es zu tun?
Details Folgen, oder Sie können überspringen, um die eigentliche Frage unten.
Dies ist ein Beispiel:
my $basic = ABC
TRIGGER => DELAY(
NUM => 500,
),
)
BASIC
my $additional = STATE_IS(
STATE => DEF,
INDEX => 0,
),
ADDITIONAL
Ich möchte den Befehl ABC
ausgeführt werden, mit einer Verzögerung von 500 (Einheiten nicht relevant sind gerade jetzt) nachdem ich nenne &event
, und der Zustand der index 0 ist DEF
.Manchmal werde ich auch wollen, zu warten, für indeces 1, 2, 3 usw...
Für nur einen index haben, ich möchte dies in meinem test:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
),
)
Für zwei indeces, die ich sehen möchte:
&event(
CMD => ABC
TRIGGER => DELAY(
NUM => 500,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 1,
),
),
),
)
Also im Grunde, ich bin das hinzufügen eines Blocks:
TRIGGER => STATE_IS(
STATE => DEF,
INDEX => 0,
),
für jeden index und der index-Nummer ändert.
Hier ist, wie ich bin, es zu tun:
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
Hier ist die eigentliche Frage
Das problem hier ist, dass der code schlecht eingerückt.Ich würde gerne führen Sie die resultierende $basic
durch eine prettifier wie diese:
&prettify($basic, "perl");
Das format würde es schön nach Perl-best practices.Gibt es eine gute Möglichkeit, dies zu tun?
Lösung
Ich habe diese verwendet:
use Perl::Tidy;
sub Format {
my $source = shift;
my $result;
Perl::Tidy::perltidy(
source => \$source,
destination => \$result,
argv => [qw(-pbp -nst)]
);
return $result;
}
Andere Tipps
PerlTidy macht den code nicht nur aufgeräumt, aber wirklich schön.Sie können leicht anpassen es entsprechend zu Ihrem lokalen coding-standards.