refactoring CGI::App for Perl6: less syntax is a theme

markjugg on 2006-08-22T02:34:53

One of the themes I've noticed moving from Perl5 to Perl6 is that less syntax is required. While I still need to get the tests to pass, CGI::App is now valid Perl6 syntax. Using "sloccount" on both versions, the Perl6 version has about 4% fewer lines in it. (A drop from 1510 lines to 1450).

Considering Perl5 had fairly efficient syntax already, each little simplification is refreshingly welcome!

Here are some things I noticed that have been removed or simplified:

  • 1; at the end of a file
  • use strict; (on by default)
  • our $VERSION = 1.23 (part of module declaration now).
  • declaring new()is not needed for simple objects. (See The Objects Synopsis)
  • Simple object methods are automatic.
  • my $self = shift; is gone -- my favorite!
  • $self->{_FOO} is just $!foo.
  • my is no longer necessary in a for loop. Instead the syntax is: for @array -> $i {
I'm sure there are more shortcuts to be discovered.

I'm also starting to refactor Perl5 idioms into more pleasant Perl6 idioms. Here are two snippets, both valid Perl6, but the second takes advantage of two new features: qw// has been replaced with < >, and any() and all() have added to the core, working like Quatum::Superpositions in Perl5, which I've always been superstitious about using in production.

Perl5ish code in Perl6

my %allowed_header_types = (
     header   => 1,
     redirect => 1,
     none     => 1,
 );

print "Invalid header_type '$header_type'" if (not %allowed_header_types<$header_type>);

Refactored to use Perl6 quoting and any()

my @allowed_header_types = 
; print "Invalid header_type '$header_type'" if not $header_type eq any(@allowed_header_types);
My experience with Perl6 thus far has been the sum of a details like this that add up to a more pleasant syntax.

Thanks to TreyHarris and wolverian for post-launch feedback on this post.