http://www.fmi.uni-passau.de/archive/doc/unix/perl/faq/1.33.html (Einblicke ins Internet, 10/1995)
Is there a pretty-printer for Perl?
Is there a pretty-printer for Perl?
That depends on what you mean. If you want something
that works like vgrind on Perl programs, then the answer
is "yes, nearly". Here's a vgrind entry for perl:
PERL|perl|Perl:\
:pb=^\d?(sub|package)\d\p\d:\
:bb={:be=}:cb=#:ce=$:sb=":se=\e":lb=':\
:le=\e':tl:\
:id=_:\
:kw=\
if for foreach unless until while continue else elsif \
do eval require \
die exit \
defined delete reset \
goto last redo next dump \
local undef return \
write format \
sub package
It doesn't actually do everything right; in particular,
things like $#, $', s#/foo##, and $foo'bar all confuse it.
David Levine uses this:
# perl 4.x David Levine <levine@ics.uci.edu> 05 apr 1993
# Derived from Tom Christiansen's perl vgrindef. I'd like to treat all of
# perl's built-ins as keywords, but vgrind fields are limited to 1024
# characters and the built-ins overflow that (surprise :-). So, I didn't
# include the dbm*, end*, get*, msg*, sem*, set*, and shm* functions. I
# couldn't come up with an easy way to distinguish beginnings of literals
# ('...') from package prefixes, so literals are not marked.
# Be sure to:
# 1) include whitespace between a subprogram name and its opening {
# 2) include whitespace before a comment (so that $# doesn't get interpreted as
# one).
perl4:\
:pb=^\d?(sub|package)\d\p\d:\
:id=$%@_:\
:bb=\e{:be=\e}:cb=\d\e#:ce=$:sb=\e":se=\e":\
:kw=accept alarm atan2 bind binmode caller chdir chmod chop chown \
chroot close closedir connect continue cos crypt defined delete die do dump \
each else elsif eof eval exec exit exp fcntl fileno flock for foreach fork \
format getc gmtime goto grep hex if include index int ioctl join keys kill \
last length link listen local localtime log lstat m mkdir next oct open \
opendir ord pack package pipe pop print printf push q qq qx rand read readdir \
readlink recv redo rename require reset return reverse rewinddir rindex rmdir \
s scalar seek seekdir select send shift shutdown sin sleep socket socketpair \
sort splice split sprintf sqrt srand stat study sub substr symlink syscall \
sysread system syswrite tell telldir time times tr truncate umask undef \
unless unlink unpack unshift until utime values vec wait waitpid wantarray \
warn while write y:
If what you mean is whether there is a program that will
reformat the program much as indent(1) will do for C, then
the answer is no. The complex feedback between the scanner
and the parser (as in the things that confuse vgrind) make
it challenging at best to write a stand-alone C parser.