At YAPC::NA 2011, the hotel made the understandable mistake of directing attendees to "The PERL Foundation" event. As you might expect someone corrected the sign by prepending ucfirst lc
.
Any self-respecting Perl hacker should be able to devise several more creative (if less straightforward) ways to correct such a mishap.
While JAPHs and obfuscations are fun, why not correct the problem at the
root? What if it were impossible to write PERL
by accident? Enter
Acme::PERL::Autocorrect,
an extension to the Perl optimizer which automatically corrects
PERL
to Perl
in literal strings in Perl source
code.
The initial version only fixed strings containing PERL
. The
second version improves that to detect PERL
as a substring. That
improvement was more difficult than it might seem. My first approach made the
tests themselves fail:
# Failed test 'use Acme::Perl::Autocorrect;'
# at t/autocorrect.t line 7.
# Tried to use 'Acme::Perl::Autocorrect'.
# Error: Can't locate Acme/Perl/Autocorrect.pm in @INC...
... for the test line:
BEGIN { use_ok( 'Acme::PERL::Autocorrect' ) }
... because the string in that statement gets rewritten as part of the
optimization process. The naï approach is to use a negative-width
lookahead regular expression to find PERL::
and exclude that from
the rewriting, but that doesn't work. By the time the custom operator override
gets to this string, Perl's optree contains instead
Acme/PERL/Autocorrect.pm
.
You may have to install a development version of optimizer to make this work, but work it does—with pure Perl. You need a decent understanding of the Perl optree to write an optimizer stage, but even this silly Acme:: module demonstrates that such things are possible.