Front page | perl.fwp |
Postings from November 2001
Practical Perl Golf
Thread Next
From:
Michael G Schwern
Date:
November 14, 2001 17:52
Subject:
Practical Perl Golf
Message ID:
20011114204938.B19999@blackrider
I have a practical golfing challenge for you all. I need two portable
one-liners:
1) Strips all comment-only lines from a Perl program (ie. /^\s*#/)
except those which are C pre-processor commands. (It's not
necessary to worry about if you're inside a string or not).
2) Same as 1, except it also strips everything before the first
#! line.
And I need them as small as possible. 80 characters would be nice.
Here's working versions of #1 and #2 respectively. They're both too
long.
perl -ne "print if (!/^\s*#/ || /^\s*#\s*(include|define|if|ifdef|ifndef|else|elif|undef|endif)/)" your_file
perl -ne "$saw_bang++ if /^#!.*(perl|PERL)/; print if $saw_bang && (!/^\s*#/ || /^\s*#\s*(include|define|if|ifdef|ifndef|else|elif|undef|endif)/)" your_file
The full story is I'm trying to get -Px working on VMS. For those
that don't know, -P is "run my program through the preprocessor before
executing", -x is "strip off all the crap before the first #!.*perl
line". Getting it working on VMS is a special challenge because the
command buffer is a mere 256 characters.
Here's how it currently works. If you invoke perl -P your_file
Perl executes the following (on Linux).
/bin/sed -e '/^[^#]/b'
-e '/^#[ ]*include[ ]/b'
-e '/^#[ ]*define[ ]/b'
-e '/^#[ ]*if[ ]/b'
-e '/^#[ ]*ifdef[ ]/b'
-e '/^#[ ]*ifndef[ ]/b'
-e '/^#[ ]*else/b'
-e '/^#[ ]*elif[ ]/b'
-e '/^#[ ]*undef[ ]/b'
-e '/^#[ ]*endif/b'
-e 's/^[ ]*#.*//' your_file |
cc -E -C -I/usr/local/perl/lib/5.6.1 -
Yep, it calls sed. Ironic, no?
sed is just stripping out /^\s*#/ lines which are not C pre-processor
commands, otherwise the CPP will get confused. It then pipes the
cleaned code off to your C pre-processor.
Two problems with this. One is not everyone has sed. Second is
that's way more than 256 characters and it overflows VMS's buffer.
So we replace the sed call with a call to perl! Two birds with one
stone. Unfortunately, what I've got is still too long.
There's another complication. When -x is used with -P you have to
ignore everything until you see the first /^#!.*(perl|PERL)/ line.
The life-support necessary to run perl and the C pre-processor under
VMS eats up about 120 characters, plus the filename which could eat
anywhere from 1 to 100 characters. This doesn't leave much room to
maneuver.
--
Michael G. Schwern <schwern@pobox.com> http://www.pobox.com/~schwern/
Perl6 Quality Assurance <perl-qa@perl.org> Kwalitee Is Job One
Is there an airport nearby or is that just my tae-kwon-do taking off?
Thread Next
-
Practical Perl Golf
by Michael G Schwern