# PERL WEEKLY CHALLENGE – 034

This is my fourth week participating into the weekly challenge.

## Easy Challenge

“Write a program that demonstrates using hash slices and/or array slices.”

This one isn’t too difficult, populate and array and hash and show a splice of each. Inf is quite useful in Raku but don’t map it into a hash 🙂

#### Perl 5 solution

``````#!/usr/bin/perl
# Test: ./ch1.pl
use strict;
use warnings;
use feature qw /say/;

my @array = (0,1,2,3,4,5,6,7,8,9);
my %hash  = (a => 1, b => 2, c => 3, d => 4);

say 'Array slice: ' . join ' ', @array[0..5];
say 'Hash slice: ' . join ' ', @hash{'a','b'};``````

Output

``````Array slice: 0 1 2 3 4 5
Hash slice: 1 2``````

#### Raku solution

``````# Test: perl6 ch1.p6
use v6.d;

sub MAIN () {
my @array = (0..Inf);
my %hash = ( a => 1, b => 2, c => 3, d => 4 );
say 'Array slice: ' ~ @array[0..5];
say 'Hash slice: ' ~ %hash{'a','b'};
}``````

Output

``````Array slice: 0 1 2 3 4 5
Hash slice: 1 2``````

## Hard Challenge

“Write a program that demonstrates a dispatch table.”

I created a dispatch_table using a hash and imaginatively called it ‘dispatch_table’. I also decided to show the dispatch table with an anonymous function.

In my Raku solution, I learned quite a few things like having to Coerce a match object so that it would work with the referenced function.

`expected Num but got Match (Match.new(hash => Map.new(…)`

I also had to do some research on how Raku does regexs, I got a bit lazy and probably should have put the regex into a variable (and does it allow capturing?)

#### Perl 5 solution

``````#!/usr/bin/perl
# Test: ./ch2.pl
use strict;
use warnings;
use feature qw(say);

my %dispatch_table = (
'-' => \&subtract,
'x' => sub { return (\$_[0] * \$_[1]); },
'/' => sub { return (\$_[0] / \$_[1]); },
);

my @equations = ('2 + 2', '10 - 4', '3 x 3', '25 / 5');
for my \$equation (@equations) {
next unless (\$equation =~ /^(\d+)\s*([\+\-x\/])\s*(\d+)\$/);

# \$1 = left, \$2 = operator, \$3 = right
say \$equation . ' = ' .
\$dispatch_table{\$2}->(\$1, \$3);
}

sub add      { return (\$_[0] + \$_[1]); }
sub subtract { return (\$_[0] - \$_[1]); }

``````

Output

``````2 + 2 = 4
10 - 4 = 6
3 x 3 = 9
25 / 5 = 5``````

#### Raku solution

``````# Test: perl6 ch2.p6
use v6.d;

sub MAIN () {
my %dispatch_table = (
'-' => &subtract,
'x' => sub (\$a , \$b) { \$a * \$b },
'/' => -> \$a , \$b { \$a / \$b },
);

my @equations = ('2 + 2', '10 - 4', '3 x 3', '25 / 5');
for (@equations) -> \$equation {
(\$equation ~~ /^(\d+)\s*(\+|\-|x|\/)\s*(\d+)\$/);
say \$equation ~ ' = ' ~
%dispatch_table{\$1}(\$0, \$2);
}
}

sub add(Num() \$a, Num() \$b)      { return (\$a + \$b); }
sub subtract(Num() \$a, Num() \$b) { return (\$a - \$b); }
``````

Output

``````2 + 2 = 4
10 - 4 = 6
3 x 3 = 9
25 / 5 = 5``````