Competition
Scott Penrose
scottp at dd.com.au
Tue Nov 19 15:10:07 CST 2002
# NOTE ON POD - It is cheat pod - easier to read in Email, not proper
pod
=head1 INTRODUCTION
Hello and welcome to our first Melbourne.pm competition.
=head1 COMPETITION
The following code is a simple example of some useful code. The idea is
to provide a number of alternatives to the code in the categories
described
below. These will then be judged and the best in each category will win
a bag of Jelly Beans complements of Melbourne.pm :-)
=head1 BACK STORY
I was writing some code which allowed you to enter a URL where the
system
would automatically move backwards until it found the closest match.
In doing so it was decided that we did not want the URLs to be
accidently
mistyped in important places. Therefore we needed a scheme that would
optionally allow bits of the URL to be chopped off.
The simple solution that we came up with was replacing the '/' in the
URL
with a '|', where on failure to find a page would fall back one step.
Eg: the url "/A/Very/Big|Directory/Reference|Links"
Would return one of (first one to exist wins)
* "/A/Very/Big/Directory/Reference/Link"
* "/A/Very/Big/Directory/Reference"
* "/A/Very/Big"
=head1 THE PERL
There are just SOOO many ways to do this. The following code is a very
simple, spread out example code.
However, I am always looking for the better way to do it. Combining list
operations (like grep, sort) are methods of reducing the need for
temporary
variables etc, but tend to drag my mind into the lands of lisp :-) but
they can be much more explanatory if formatted correctly.
=head1 THE PROJECT
To demonstrate the better layout, performance, size and flexibility of
good perl code for the good of all I am going to offer a bag of Jelly
Beans
to the winner of each of the following categories. Winners of each
will be chosen by the current Perl Mongers Admin Committee (admin
members
will be able to enter code, but only as examples for the web site and
not for the competition).
In all of the following (except EXISTING MODULES), no perl modules
should be used, only core language. Only one entry per category per
person.
Entries must be received by 6pm Monday the 25th of November.
The command line inputs and outputs should be similar to the example,
but
not necessarily the same. The 'sub test' emulating the module will not
be judged, but should not contain any of the logic.
=head2 FASTEST VERSION
A version of the code that performs the fastest, no matter how ugly or
how long.
=head2 SMALLEST VERSION
A version of the code with the shortest source, not counting white space
or comments.
=head2 EASIEST TO READ / MAINTAIN
The best overall version to read and maintain, the sort of code you
would like to read and maintain if someone else wrote it.
=head2 EXISTING MODULES
Demonstrate your CPANability and show what modules could be used to
help this problem.
=head2 WEIRDEST VERSION
Hmmm.... says it all :-)
=head2 PERL 6
A perl6 version. Judged on a balance of easy to read, length and
use of Perl 6 features.
=head1 RESULTS
Results will be judged over the following week and should be completed
by Sunday 30th of November.
The winners and interesting entries will then be formatted as examples
on our web site for others to benefit from.
=cut
# ----------------------------------------------------------------------
# Test String =
my $test = $ARGV[1] || "A/Very/Big|Directory/Reference|Links";
# ----------------------------------------------------------------------
# Test object create in order of
# A/Very/Big/Directory/Reference/Link
# A/Very/Big/Directory/Reference
# A/Very/Big
# All other alternatives are not valid (eg: /A/Very/Big/Directory)
my $ret = undef;
my ($key, @try) = split(/\|/, $test);
while (!defined($ret)) {
print STDERR "Try = " . join('/', $key, @try) . "\n";
$ret = test(
join('/', $key, @try)
);
} continue {
last unless (pop @try);
}
print "Return Value = $ret\n";
exit 0;
# ----------------------------------------------------------------------
# The dummy test object - pretend to return a blessed object or undef.
sub test {
return ($_[0] eq ($ARGV[0] || 'A/Very/Big')) ? 1 : undef;
}
__END__
--
Scott Penrose
Anthropomorphic Personification Expert
http://search.cpan.org/search?author=SCOTT
scott at cpan.org
Dismaimer: While every attempt has been made to make sure that this
email only contains zeros and ones, there has been no effort made to
guarantee the quantity or the order.
More information about the Melbourne-pm
mailing list