Last week I explored using the Inline::Perl5 module to port a short Perl script to Raku while still keeping its Perl dependencies. Over at the community, Dave Cross pointed out that I could get a bit more bang for my buck by letting his Feed::Find do the heavy lifting instead of WWW::Mechanizes more general-​purpose parsing.

A little more MetaCPAN investigation yielded XML::Feed, also maintained by Dave, and it had the added benefit of obviating my need for XML::RSS by not only discovering feeds but also retrieving and parsing them. It also handles the Atom syndication format as well as RSS (hi daxim!). Putting it all together produces the following much shorter and clearer Perl:

#!/usr/bin/env perl

use v5.12; # for strict and say
use warnings;
use XML::Feed;
use URI;

my $url = shift @ARGV || '';

my @feeds = XML::Feed->find_feeds($url);
my $feed  = XML::Feed->parse( URI->new( $feeds[0] ) )
    or die "Couldn't find a feed at $url\n";

binmode STDOUT, ':encoding(UTF-8)';
say $_->title, "\t", $_->link for $feed->entries;

And here’s the Raku version:

#!/usr/bin/env raku

use XML::Feed:from<Perl5>;
use URI:from<Perl5>;

sub MAIN($url = '') {
    my @feeds = XML::Feed.find_feeds($url);
    my $feed  = XML::Feed.parse( @feeds.first ) )
        or exit note "Couldn't find a feed at $url";

    put .title, "\t", .link for $feed.entries;

It’s even closer to Perl now, though it’s using the first routine rather than subscripting the @feeds array and leaving off the the $_ variable name when calling methods on it—less punctuation noise often aids readability. I also took a suggested exit idiom from Raku developer Elizabeth Mattijsen on Reddit to simplify the contortions I was going through to exit with a simple message and error code.

There are a couple of lessons here:

  • A little more effort in module shopping pays dividends in simpler code.
  • Get feedback from far and wide to help improve your code. If it’s for work and you can’t release as open-​source, make sure your code review process covers readability and maintainability.

5 thoughts on “Frenemies part 2: What a difference a (Perl) module makes

  1. For short programs with no other subroutines, I prefer using unit sub MAIN(signature here);, which treats the entire file as the body of the MAIN subroutine and saves you some curlies and an indentation level while still getting you the automatic argument parsing that comes from declaring a MAIN sub.

  2. @natalie #Perl to #RakuLang isn’t necessarily an upgrade,” it’s a port to a different ecosystem and language with some similarities.I did a pair of blog posts last year showing how you could start with a small bit of Perl code and then rewrite some of it in Raku while still using Perl CPAN modules:•
    Perl & Raku: Best frenemies—The Phoenix Trap

Comments are closed.