<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kian Meng, Ang</title>
    <description>The latest articles on DEV Community by Kian Meng, Ang (@kianmeng).</description>
    <link>https://dev.to/kianmeng</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F268730%2F35c1a3ba-6818-44fb-b4e4-969f1669b010.png</url>
      <title>DEV Community: Kian Meng, Ang</title>
      <link>https://dev.to/kianmeng</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kianmeng"/>
    <language>en</language>
    <item>
      <title>
Perl Weekly Challenge - 038</title>
      <dc:creator>Kian Meng, Ang</dc:creator>
      <pubDate>Wed, 25 Dec 2019 16:35:06 +0000</pubDate>
      <link>https://dev.to/kianmeng/perl-weekly-challenge-038-do8</link>
      <guid>https://dev.to/kianmeng/perl-weekly-challenge-038-do8</guid>
      <description>&lt;p&gt;Original published in &lt;a href="https://www.kianmeng.org/2019/12/perl-weekly-challenge-037-2019-week-51.html"&gt;kianmeng.org&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-038/"&gt;Perl Weekly Chanllenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continues from &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-037/"&gt;previous week&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/manwar/perlweeklychallenge"&gt;submit a merge request or open a ticket&lt;/a&gt; if you found any issues with this post. We highly appreciate and welcome your feedback.&lt;/p&gt;

&lt;p&gt;For a quick overview, go through the &lt;a href="https://perlweeklychallenge.org/blog/perl-weekly-challenge-038/"&gt;original tasks&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/recap-challenge-038/"&gt;recap&lt;/a&gt; of the weekly challenge.&lt;/p&gt;

&lt;p&gt;Additional feedback to the our Perl Weekly Challenge’s &lt;a href="https://twitter.com/perlwchallenge?lang=en"&gt;Twitter account&lt;/a&gt; is much appreciated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Carp"&gt;&lt;code&gt;Carp&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Date::Calc"&gt;&lt;code&gt;Date::Calc&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Date::Manip"&gt;&lt;code&gt;Date::Manip&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/DateTime"&gt;&lt;code&gt;DateTime&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/POSIX"&gt;&lt;code&gt;POSIX&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::Exception"&gt;&lt;code&gt;Test::Exception&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::More"&gt;&lt;code&gt;Test::More&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Local"&gt;&lt;code&gt;Time::Local&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Piece"&gt;&lt;code&gt;Time::Piece&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Try::Tiny"&gt;&lt;code&gt;Try::Tiny&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/boolean"&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another week, another date related challenge.&lt;/p&gt;

&lt;p&gt;For this task, we observed there were two approaches in validating the 7-digits date, either using a regex or non-regex at all. Almost everyone took the former approach but some participant have put in extra effort to ensure the readability of the code, especially the regex. Yes, you can write readable and maintainable code in Perl, regardless its notorious reputation of &lt;a href="https://www.perl.com/pub/2000/01/10PerlMyths.html/#Perl_looks_like_line_noise"&gt;looking like line noise&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First, look at the submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/adam-russell/perl5/ch-1.pl"&gt;Adam Russell&lt;/a&gt;. It's a straightforward approach to validate the 7-digits date. But it didn't tell us much on what being extracted or matched from the regex without checking back the requirement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;is_valid&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;m/([1-2]{1})([0-9]{2})(0[1-9]{1}|1[012]{1})(0[1-9]{1}|1[012]{1}|2[0-9]{1})/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, compare to these code submissions.&lt;/p&gt;

&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/javier-luque/perl5/ch-1.pl"&gt;Javier Luque&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Regex to test date format&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid date format&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nv"&gt;$date&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$date&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;
        &lt;span class="o"&gt;^&lt;/span&gt;                     &lt;span class="c1"&gt;# start string&lt;/span&gt;
        &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                &lt;span class="c1"&gt;# 1 or 2&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                &lt;span class="c1"&gt;# year 00-99&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;       &lt;span class="c1"&gt;# month 1-12&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# day 1-31&lt;/span&gt;
        &lt;span class="nv"&gt;$&lt;/span&gt;                     &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nv"&gt;end&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/dave-jacoby/perl5/ch-1.pl"&gt;Dave Jacoby&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$century&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$day&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$string&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;m{
    ^         # start of string
    (\d)      # century value 1-2
    (\d{2}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# year value 00-99&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;   &lt;span class="c1"&gt;# month value 01-12&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;   &lt;span class="c1"&gt;# day value 01-31, plus&lt;/span&gt;
    &lt;span class="nv"&gt;$&lt;/span&gt;         &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nv"&gt;end&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nv"&gt;mx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/andrezgz/perl5/ch-1.pl"&gt;Andrezgz&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid 7-digits date&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vg"&gt;$/&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;!~&lt;/span&gt; &lt;span class="o"&gt;/^&lt;/span&gt;
        &lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;y1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                    &lt;span class="c1"&gt;# 1st: 1 or 2&lt;/span&gt;
        &lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;y2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;                    &lt;span class="c1"&gt;# 2nd &amp;amp; 3rd: anything&lt;/span&gt;
        &lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;m&amp;gt;0[1-9]|1[0-2])             # 4th &amp;amp; 5th: month
        (?&amp;lt;d&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;    &lt;span class="c1"&gt;# 6th &amp;amp; 7th: day of the month&lt;/span&gt;
    &lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/ryan-thompson/perl5/ch-1.pl"&gt;Ryan Thompson&lt;/a&gt;. Yes, we do agree, the regex is the real star.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This regex is the real star of the show&lt;/span&gt;
&lt;span class="nv"&gt;$ARGV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="o"&gt;/^&lt;/span&gt;
    &lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;cent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Century, 1:1900, 2:2000&lt;/span&gt;
    &lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;yy&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt;                    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Year (2-digit)&lt;/span&gt;
    &lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;mm&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mo"&gt;012&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Month&lt;/span&gt;
    &lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Day&lt;/span&gt;
&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usage: $0 Cyymmdd&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;How about non-regex solution, as usual, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt; surprised us with his submission by not using any regex at all. Compare his solution to the above mentioned regex examples, which is more readable and understandable at a quick glance?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid length&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt; &lt;span class="nv"&gt;$number&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt; &lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid year&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;

    &lt;span class="nv"&gt;$date&lt;/span&gt; &lt;span class="o"&gt;.=&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt; &lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$tp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Time::Piece&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%Y%m%d&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid date&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nv"&gt;$tp&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$tp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;mon&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt; &lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$tp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;ymd&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So what have we learned here from these submissions. You can write good and readable regex with good comment, split regex into multiple lines with the help of &lt;code&gt;\x&lt;/code&gt; modifier, named captured variables, and good code indentation. The submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/ryan-thompson/perl5/ch-1.pl"&gt;Ryan Thompson&lt;/a&gt; was a good example of this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Algorithm::Combinatorics"&gt;&lt;code&gt;Algorithm::Combinatorics&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/File::Slurp"&gt;&lt;code&gt;File::Slurp&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/File::Slurper"&gt;&lt;code&gt;File::Slurper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Long"&gt;&lt;code&gt;Getopt::Long&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/LWP::Simple"&gt;&lt;code&gt;LWP::Simple&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Math::Combinatorics"&gt;&lt;code&gt;Math::Combinatorics&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Memoize"&gt;&lt;code&gt;Memoize&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Readonly"&gt;&lt;code&gt;Readonly&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/autodie"&gt;&lt;code&gt;autodie&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/constant"&gt;&lt;code&gt;constant&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/enum"&gt;&lt;code&gt;enum&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the question did not explain it explicitly, the task is like a &lt;a href="https://en.wikipedia.org/wiki/Scrabble"&gt;Scrabble&lt;/a&gt; game.&lt;/p&gt;

&lt;p&gt;Let's us compare how participants initialize the character value/point/score and frequency/count.&lt;/p&gt;

&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/ruben-westerberg/perl5/ch-2.pl"&gt;Ruben Westerberg&lt;/a&gt; which have the shortest code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@l&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;split&lt;/span&gt; &lt;span class="p"&gt;"",&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AGISUXZEJLRVYFDPWBNTOHMCKQ&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;x7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;x6&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;x4&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;x5&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/ryan-thompson/perl5/ch-2.pl"&gt;Ryan Thompson&lt;/a&gt;. Notice the for loop used to initialize the tile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Point values for each tile, as given in the challenge description:&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$val&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="sx"&gt;qw&amp;lt; A G I S U X Z &amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$val&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="sx"&gt;qw&amp;lt; E J L R V Y   &amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$val&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="sx"&gt;qw&amp;lt; F D P W       &amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$val&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="sx"&gt;qw&amp;lt; B N           &amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$val&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="sx"&gt;qw&amp;lt; T O H M C     &amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$val&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="sx"&gt;qw&amp;lt; K Q           &amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Tile counts in bag. Each letter is repeated the specified number of times&lt;/span&gt;
&lt;span class="c1"&gt;# We shuffle with List::Util's shuffle(), but see perlfaq4 for Fisher-Yates&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@bag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;shuffle&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;split&lt;/span&gt; &lt;span class="sr"&gt;//&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="sx"&gt;qw&amp;lt; A8 G3 I5 S7 U5 X2 Z5
        E9 J3 L3 R3 V3 Y5
        F3 D3 P5 W5
        B5 N4
        T5 O3 H3 M4 C4
        K2 Q2 &amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/andrezgz/perl5/ch-2.pl"&gt;Andrezgz&lt;/a&gt;. Similar to &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/ruben-westerberg/perl5/ch-2.pl"&gt;Ruben Westerberg&lt;/a&gt; but more readable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Points for each tile&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;tile_points&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;G&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;I&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;U&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;Z&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;E&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;J&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;V&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;F&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;W&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;O&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;K&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;Q&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;# Lot of available tiles&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@lot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;K&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;X&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;D&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;F&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;G&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;H&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;J&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;L&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;O&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;R&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;V&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;C&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;M&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;N&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;B&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;I&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;P&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;T&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;U&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;W&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;S&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;E&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-038/e-choroba/perl5/ch-2.pl"&gt;E. Choroba&lt;/a&gt;. A rather elegant way of initializing the score and count of character tiles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;tile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;G&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;I&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;U&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;Z&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;E&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;J&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;V&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;F&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;W&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;O&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;K&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;Q&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@all&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;$tile&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}[&lt;/span&gt;&lt;span class="nv"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;tile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  See Also
&lt;/h3&gt;

&lt;p&gt;(1) &lt;a href="https://perlchallenges.wordpress.com/2019/12/10/perl-weekly-challenge-038/"&gt;Perl Weekly Challenge – 038&lt;/a&gt; by Javier Luque&lt;br&gt;
(2) &lt;a href="https://raku-musings.com/date-word.html"&gt;Datefinder General, A Raku Wordgame&lt;/a&gt; by Arne Sommer&lt;br&gt;
(3) &lt;a href="https://adamcrussell.livejournal.com/12987.html"&gt;Perl Weekly Challenge 038&lt;/a&gt; by Adam Russell&lt;br&gt;
(4) &lt;a href="https://jacoby.github.io/2019/12/10/words-and-dates-which-is-more-fun.html"&gt;Words and Dates: Which is more fun?&lt;/a&gt; by Dave Jacoby&lt;br&gt;
(5) &lt;a href="http://217.229.26.129:81/www/Perl/PWC/20191215_38/ch-1.html"&gt;Perl Weekly Challenge #38&lt;/a&gt; by Burkhard Nickels&lt;br&gt;
(6) &lt;a href="http://blogs.perl.org/users/laurent_r/2019/12/perl-weekly-challenge-38-date-finder-and-word-game.html"&gt;Perl Weekly Challenge 38: Date Finder and Word Game&lt;/a&gt; by Laurent Rosenfeld&lt;br&gt;
(7) &lt;a href="http://blogs.perl.org/users/e_choroba/2019/12/perl-weekly-challenge-038-date-finder-and-word-game.html"&gt;Perl Weekly Challenge 038: Date Finder and Word Game&lt;/a&gt; by E. Chorob&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perlweeklychallenge</category>
    </item>
    <item>
      <title>Perl Weekly Challenge - 037</title>
      <dc:creator>Kian Meng, Ang</dc:creator>
      <pubDate>Tue, 17 Dec 2019 12:18:04 +0000</pubDate>
      <link>https://dev.to/kianmeng/perl-weekly-challenge-037-3mm6</link>
      <guid>https://dev.to/kianmeng/perl-weekly-challenge-037-3mm6</guid>
      <description>&lt;p&gt;Originally published in &lt;a href="https://www.kianmeng.org/2019/12/perl-weekly-challenge-037-2019-week-50.html"&gt;kianmeng.org&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-037/"&gt;Perl Weekly Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continues from &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-037/"&gt;previous week&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/manwar/perlweeklychallenge"&gt;submit a merge request or open a ticket&lt;/a&gt; if you found any issues with this post. We highly appreciate and welcome your feedback.&lt;/p&gt;

&lt;p&gt;For a quick overview, go through the &lt;a href="https://perlweeklychallenge.org/blog/perl-weekly-challenge-038/"&gt;original tasks&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/recap-challenge-038/"&gt;recap&lt;/a&gt; of the weekly challenge.&lt;/p&gt;

&lt;p&gt;Additional feedback to the our Perl Weekly Challenge’s &lt;a href="https://twitter.com/perlwchallenge?lang=en"&gt;Twitter account&lt;/a&gt; is much appreciated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Date::Manip"&gt;&lt;code&gt;Date::Manip&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/DateTime"&gt;&lt;code&gt;DateTime&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/DateTime::Duration"&gt;&lt;code&gt;DateTime::Duration&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/DateTime::Event::Recurrence"&gt;&lt;code&gt;DateTime::Event::Recurrence&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Function::Parameters"&gt;&lt;code&gt;Function::Parameters&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Modern::Perl"&gt;&lt;code&gt;Modern::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/POSIX"&gt;&lt;code&gt;POSIX&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::More"&gt;&lt;code&gt;Test::More&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Local"&gt;&lt;code&gt;Time::Local&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Moment"&gt;&lt;code&gt;Time::Moment&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Piece"&gt;&lt;code&gt;Time::Piece&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Seconds"&gt;&lt;code&gt;Time::Seconds&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::localtime"&gt;&lt;code&gt;Time::localtime&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/constant"&gt;&lt;code&gt;constant&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a similar task to the previous challenges. Thus, we observed some participants reuse the same code with some modifications.&lt;/p&gt;

&lt;p&gt;For a start, look at the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/ryan-thompson/perl5/ch-1.pl"&gt;Ryan Thompson&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/colin-crain/perl5/ch-1.pl"&gt;Colin Crain&lt;/a&gt; which were heavily commented. This should provides us with some context and their thought on solving this tasks. Similarly but in blog post, read the write-up by &lt;a href="http://blogs.perl.org/users/laurent_r/2019/12/perl-weekly-challenge-37-week-days-in-each-month-and-daylight-gainloss.html"&gt;Laurent Rosenfeld&lt;/a&gt;, &lt;a href="http://blogs.perl.org/users/e_choroba/2019/12/perl-weekly-challenge-037-weekdays-and-daylight-gainloss.html"&gt;E. Choroba&lt;/a&gt;, and &lt;a href="https://raku-musings.com/weekdays-daylight.html"&gt;Arne Sommer&lt;/a&gt;. They provides us with even more insight on how they approached this task.&lt;/p&gt;

&lt;p&gt;And as usual, a few things that caught our attention.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Date::Manip::Recur&lt;/code&gt; CPAN module used by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/colin-crain/perl5/ch-1.pl"&gt;Colin Crain&lt;/a&gt; was rather interesting and unique compare to typical CPAN modules found in most submitted solutions. The CPAN module provides a way to parse and manipulate recurrence which was used by the participant to filter out all weekdays.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$recur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nn"&gt;Date::Manip::&lt;/span&gt;&lt;span class="nv"&gt;Recur&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$recur&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;0:0:0:1*0:0:0*IBD&lt;/span&gt;&lt;span class="p"&gt;","&lt;/span&gt;&lt;span class="s2"&gt;Jan 1  2019&lt;/span&gt;&lt;span class="p"&gt;","&lt;/span&gt;&lt;span class="s2"&gt;Jan 1  2019&lt;/span&gt;&lt;span class="p"&gt;","&lt;/span&gt;&lt;span class="s2"&gt;Dec 31 2019&lt;/span&gt;&lt;span class="p"&gt;");&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$recur&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;dates&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, if the above recurrence modifier string was rather obscure, look at the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/javier-luque/perl5/ch-1.pl"&gt;Javier Luque&lt;/a&gt; which use the &lt;code&gt;DateTime::Event::Recurrence&lt;/code&gt; CPAN module. As shown below, the code is pretty much self-explanatory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$working_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nn"&gt;DateTime::Event::&lt;/span&gt;&lt;span class="nv"&gt;Recurrence&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;weekly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;days&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For a purist solution (without using any CPAN modules), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/adam-russell/perl5/ch-1.pl"&gt;Adam Russell&lt;/a&gt; was the only particpant who seemed to achieve that feat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Astro::Coord::ECI"&gt;&lt;code&gt;Astro::Coord::ECI&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Astro::Coord::ECI::Sun"&gt;&lt;code&gt;Astro::Coord::ECI::Sun&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Astro::Coord::ECI::Utils"&gt;&lt;code&gt;Astro::Coord::ECI::Utils&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Astro::Sunrise"&gt;&lt;code&gt;Astro::Sunrise&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/DateTime"&gt;&lt;code&gt;DateTime&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/DateTime::Duration"&gt;&lt;code&gt;DateTime::Duration&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/DateTime::Event::Sunrise"&gt;&lt;code&gt;DateTime::Event::Sunrise&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/File::Slurp"&gt;&lt;code&gt;File::Slurp&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Function::Parameters"&gt;&lt;code&gt;Function::Parameters&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Long"&gt;&lt;code&gt;Getopt::Long&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/HTML::Parser"&gt;&lt;code&gt;HTML::Parser&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/HTML::TableExtract"&gt;&lt;code&gt;HTML::TableExtract&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/HTTP::Tiny"&gt;&lt;code&gt;HTTP::Tiny&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/LWP::Simple"&gt;&lt;code&gt;LWP::Simple&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/LWP::UserAgent"&gt;&lt;code&gt;LWP::UserAgent&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Modern::Perl"&gt;&lt;code&gt;Modern::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Mojo::UserAgent"&gt;&lt;code&gt;Mojo::UserAgent&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Pod::Usage"&gt;&lt;code&gt;Pod::Usage&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/String::Util"&gt;&lt;code&gt;String::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Syntax::Construct"&gt;&lt;code&gt;Syntax::Construct&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Local"&gt;&lt;code&gt;Time::Local&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Piece"&gt;&lt;code&gt;Time::Piece&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::Seconds"&gt;&lt;code&gt;Time::Seconds&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/URI"&gt;&lt;code&gt;URI&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/WWW::Mechanize"&gt;&lt;code&gt;WWW::Mechanize&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Web::Scraper"&gt;&lt;code&gt;Web::Scraper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/constant"&gt;&lt;code&gt;constant&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/integer"&gt;&lt;code&gt;integer&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This task reminded us of the optional third task we used to have in previous challenges in using web services or APIs.&lt;/p&gt;

&lt;p&gt;For this task, we can group the submitted solutions into three groups. Those who scrapped the daylight gain and loss data from the Interweb, those who scrapped and pre-cached, or those who calculate dynamically.&lt;/p&gt;

&lt;p&gt;Participants who approached this task with the first approach were &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/mark-anderson/perl5/ch-2.pl"&gt;Mark Anderson&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/javier-luque/perl5/ch-2.pl"&gt;Javier Luque&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/adam-russell/perl5/ch-2.pl"&gt;Adam Russell&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/ruben-westerberg/perl5/ch-2.pl"&gt;Ruben Westerberg&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/saiftynet/perl5/ch-2.pl"&gt;Saiftynet&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/e-choroba/perl5/ch-2.pl"&gt;E. Choroba&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Participants who pre-cached the daylight data were &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/laurent-rosenfeld/perl5/ch-2.pl"&gt;Laurent Rosenfeld&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/andrezgz/perl5/ch-2.pl"&gt;Andrezgz&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/colin-crain/perl5/ch-2.pl"&gt;Colin Crain&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Participants who opted to calculate daylight details dynamically were &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/dave-jacoby/perl5/ch-2.pl"&gt;Dave Jacoby&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/roger-bell-west/perl5/ch-2.pl"&gt;Roger Bell West&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/lubos-kolouch/perl5/ch-2.pl"&gt;Lubos Kolouch&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/ryan-thompson/perl5/ch-2.pl"&gt;Ryan Thompson&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/duncan-c-white/perl5/ch-2.pl"&gt;Duncan C White&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Again, certain solutions that caught our attentions.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Forward-looking_statement"&gt;forward-looking statement or safe habour statement found&lt;/a&gt; in the submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/colin-crain/perl5/ch-2.pl"&gt;Colin Crain&lt;/a&gt; was rather intriguing and justifiable due to the uncertainties in predicting the daylight result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/ryan-thompson/perl5/ch-2.pl"&gt;Ryan Thompson&lt;/a&gt; basically wrote a console app or rather a CPAN module to calculate the difference of daylight between two months.&lt;/p&gt;

&lt;p&gt;The solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-037/mark-anderson/perl5/ch-2.pl"&gt;Mark Anderson&lt;/a&gt; is a short and practical demonstration of how &lt;a href="https://en.wikipedia.org/wiki/MapReduce"&gt;MapReduce&lt;/a&gt; works.&lt;/p&gt;

&lt;h3&gt;
  
  
  See Also
&lt;/h3&gt;

&lt;p&gt;(1) &lt;a href="https://perlchallenges.wordpress.com/2019/12/02/perl-weekly-challenge-037/"&gt;Perl Weekly Challenge - 037&lt;/a&gt; by Javier Luque&lt;br&gt;
(2) &lt;a href="https://raku-musings.com/weekdays-daylight.html"&gt;Weekdays, Daylight and Raku&lt;/a&gt; by Arne Sommer&lt;br&gt;
(3) &lt;a href="https://adamcrussell.livejournal.com/12735.html"&gt;Weekdays and Daytimes&lt;/a&gt; by Adam Russell&lt;br&gt;
(4) &lt;a href="https://jacoby.github.io/2019/12/02/sunrise-and-sunset-in-perl.html"&gt;Sunrise and Sunset in Perl&lt;/a&gt; by Dave Jacoby&lt;br&gt;
(5) &lt;a href="http://blogs.perl.org/users/laurent_r/2019/12/perl-weekly-challenge-37-week-days-in-each-month-and-daylight-gainloss.html"&gt;Perl Weekly Challenge 37: Week Days in Each Month and Daylight Gain/loss&lt;/a&gt; by Laurent Rosenfeld&lt;br&gt;
(6) &lt;a href="https://blog.firedrake.org/archive/2019/12/Perl_Weekly_Challenge_37__weekdays_and_day_lengths.html"&gt;Perl Weekly Challenge 37: weekdays and day lengths&lt;/a&gt; by Roger Bell West&lt;br&gt;
(7) &lt;a href="http://blogs.perl.org/users/e_choroba/2019/12/perl-weekly-challenge-037-weekdays-and-daylight-gainloss.html"&gt;Perl Weekly Challenge 037: Weekdays and Daylight Gain/Loss&lt;/a&gt; by E. Choroba&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perlweeklychallenge</category>
    </item>
    <item>
      <title>Perl Weekly Challenge - 036</title>
      <dc:creator>Kian Meng, Ang</dc:creator>
      <pubDate>Tue, 10 Dec 2019 14:24:30 +0000</pubDate>
      <link>https://dev.to/kianmeng/perl-weekly-challenge-036-fk8</link>
      <guid>https://dev.to/kianmeng/perl-weekly-challenge-036-fk8</guid>
      <description>&lt;p&gt;Originally published in &lt;a href="https://www.kianmeng.org/2019/12/perl-weekly-challenge-036-2019-week-49.html"&gt;kianmeng.org&lt;/a&gt; and &lt;a href=""&gt;Perl Weekly Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continues from &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-035/"&gt;previous week&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/manwar/perlweeklychallenge"&gt;submit a merge request or open a ticket&lt;/a&gt; if you found any issues with this post. We highly appreciate and welcome your feedback.&lt;/p&gt;

&lt;p&gt;For a quick overview, go through the &lt;a href="https://perlweeklychallenge.org/blog/perl-weekly-challenge-036/"&gt;original tasks&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/recap-challenge-036/"&gt;recap&lt;/a&gt; of the weekly challenge.&lt;/p&gt;

&lt;p&gt;Additional feedback to the our Perl Weekly Challenge’s &lt;a href="https://twitter.com/perlwchallenge?lang=en"&gt;Twitter account&lt;/a&gt; is much appreciated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Data::Validate::VIN"&gt;&lt;code&gt;Data::Validate::VIN&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Function::Parameters"&gt;&lt;code&gt;Function::Parameters&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::MoreUtils"&gt;&lt;code&gt;List::MoreUtils&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Readonly"&gt;&lt;code&gt;Readonly&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Syntax::Construct"&gt;&lt;code&gt;Syntax::Construct&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::Exception"&gt;&lt;code&gt;Test::Exception&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::More"&gt;&lt;code&gt;Test::More&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/boolean"&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read the background details on the &lt;a href="https://en.wikipedia.org/wiki/Vehicle_identification_number"&gt;Vehicle Identification Number (VIN)&lt;/a&gt; first.&lt;/p&gt;

&lt;p&gt;Next, look at the submissions by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/duane-powell/perl5/ch-1.pl"&gt;Duane Powell&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/lubos-kolouch/perl5/ch-1.pl"&gt;Lubos Kolouch&lt;/a&gt;. Try solve any problems in Perl with available CPAN module. For this task, there exists &lt;code&gt;Data::Validate::VIN&lt;/code&gt; CPAN module. For those who are curious, you can reading the &lt;a href="https://metacpan.org/release/Data-Validate-VIN/source/lib/Data/Validate/VIN.pm"&gt;source code&lt;/a&gt; of the CPAN module and compare with all the submissions here.&lt;/p&gt;

&lt;p&gt;Following that, for submissions with good readability and easy to follow code, look no further into the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/laurent-rosenfeld/perl5/ch-1.pl"&gt;Laurent Rosenfeld&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/jaldhar-h-vyas/perl5/ch-1.pl"&gt;Jaldhar H Vyas&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/javier-luque/perl5/ch-1.pl"&gt;Javier Luque&lt;/a&gt;. Observe their clean coding style.&lt;/p&gt;

&lt;p&gt;For this task, we need to predefine a set of values. Compare these submissions by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/adam-russell/perl5/ch-1.pl"&gt;Adam Russell&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/ruben-westerberg/perl5/ch-1.pl"&gt;Ruben Westerberg&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/duncan-c-white/perl5/ch-1.pl"&gt;Duncan C White&lt;/a&gt;. See how they declare and initialize the hash table of the valid characters, weights, check digits, country codes, and manufacturers. We're not sure how Duncan obtained the list of data, but that was a large and long list.&lt;/p&gt;

&lt;p&gt;Now, besides reading the blog on how each participant solved this task, you can read the detail comments written in the submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/burkhard-nickels/perl5/ch-1.pl"&gt;Burkhard Nickels&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/colin-crain/perl5/ch-1.pl"&gt;Colin Crain&lt;/a&gt;. These participants have put in great length in documenting their thoughts on solving this task.&lt;/p&gt;

&lt;p&gt;When come to writing own test cases, look at the submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/saiftynet/perl5/ch-1.pl"&gt;Saiftynet&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/steven-wilson/perl5/ch-1.pl"&gt;Steven Wilson&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt;. Reading these test cases will give us an idea on how the subroutines supposed to be used.&lt;/p&gt;

&lt;p&gt;While we went through these submissions, the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/andrezgz/perl5/ch-1.pl"&gt;Andrezgz&lt;/a&gt; caught our attention as shown below. &lt;a href="https://perldoc.perl.org/CORE.html"&gt;&lt;code&gt;CORE::&lt;/code&gt; prefix&lt;/a&gt; will enforce only the built-in function, in this case, &lt;code&gt;state&lt;/code&gt; to be used.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;  &lt;span class="nn"&gt;CORE::&lt;/span&gt;&lt;span class="nv"&gt;state&lt;/span&gt; &lt;span class="nv"&gt;$trans_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;E&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;F&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;G&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;H&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;J&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;K&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;L&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;M&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="s"&gt;P&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="s"&gt;R&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="s"&gt;S&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;T&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;V&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;W&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;Z&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Task #2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Algorithm::Combinatorics"&gt;&lt;code&gt;Algorithm::Combinatorics&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Algorithm::Knapsack"&gt;&lt;code&gt;Algorithm::Knapsack&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Box::Calc"&gt;&lt;code&gt;Box::Calc&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Data::PowerSet"&gt;&lt;code&gt;Data::PowerSet&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Function::Parameters"&gt;&lt;code&gt;Function::Parameters&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Math::Combinatorics"&gt;&lt;code&gt;Math::Combinatorics&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Modern::Perl"&gt;&lt;code&gt;Modern::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Readonly"&gt;&lt;code&gt;Readonly&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::Deep"&gt;&lt;code&gt;Test::Deep&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::More"&gt;&lt;code&gt;Test::More&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Tie::IxHash"&gt;&lt;code&gt;Tie::IxHash&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/constant"&gt;&lt;code&gt;constant&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To understand the task at hand, read the background details of &lt;a href="https://en.wikipedia.org/wiki/Knapsack_problem"&gt;Knapsack Problem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Start with the submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/duncan-c-white/perl5/ch-2.pl"&gt;Duncan C White&lt;/a&gt; (solved by hand), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/adam-russell/perl5/ch-2.pl"&gt;Adam Russell&lt;/a&gt; (simplest), and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/colin-crain/perl5/ch-2.pl"&gt;Colin Crain&lt;/a&gt; (detail step-by-step comment) to get an initial concept on how to solve it.&lt;/p&gt;

&lt;p&gt;Next, using similar approach but coded in more verbose style, read the solutions by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/ruben-westerberg/perl5/ch-2.pl"&gt;Ruben Westerberg&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/saiftynet/perl5/ch-2.pl"&gt;Saiftynet&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/laurent-rosenfeld/perl5/ch-2.pl"&gt;Laurent Rosenfeld&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/roger-bell-west/perl5/ch-2.pl"&gt;Roger Bell West&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/andrezgz/perl5/ch-2.pl"&gt;Andrezgz&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lastly, look into submissions which used CPAN modules (listed above) by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/burkhard-nickels/perl5/ch-2.pl"&gt;Burkhard Nickels&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/mark-anderson/perl5/ch-2.pl"&gt;Mark Anderson&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/duane-powell/perl5/ch-2.pl"&gt;Duane Powell&lt;/a&gt;. See how these CPAN modules helped in generating all possible combinations to the solutions.&lt;/p&gt;

&lt;p&gt;Most unique approach came from &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-036/e-choroba/perl5/ch-2.pl"&gt;E. Choroba&lt;/a&gt; which used an indicator function approach. Read his &lt;a href="http://blogs.perl.org/users/e_choroba/2019/12/perl-weekly-challenge-036-vin-validation-and-the-knapsack-problem.html"&gt;blog post&lt;/a&gt; for further details.&lt;/p&gt;

&lt;h3&gt;
  
  
  See Also
&lt;/h3&gt;

&lt;p&gt;(1) &lt;a href="https://raku-musings.com/vin-knapsack.html"&gt;Vin Knapsack Meets Raku&lt;/a&gt; by Arne Sommer&lt;br&gt;
(2) &lt;a href="https://adamcrussell.livejournal.com/12459.html"&gt;VIN Validation&lt;/a&gt; by Adam Russell&lt;br&gt;
(3) &lt;a href="//pearls.dyndnss.net"&gt;Perl Weekly Challenge #36&lt;/a&gt; by Burkhard Nickels&lt;br&gt;
(4) &lt;a href="http://blogs.perl.org/users/laurent_r/2019/12/perl-weekly-challenge-36-vehicle-identification-numbers-vin-and-the-knapsack-problem.html"&gt;Perl Weekly Challenge 36: Vehicle Identification Numbers (VIN) and the Knapsack Problem&lt;/a&gt; by Laurent Rosenfeld&lt;br&gt;
(5) &lt;a href="https://kevincolyer.wordpress.com/2019/11/29/perl-weekly-challenge-week-36/"&gt;Perl Weekly Challenge – Week 36&lt;/a&gt; by Kevin Colyer&lt;br&gt;
(6) &lt;a href="http://blogs.perl.org/users/e_choroba/2019/12/perl-weekly-challenge-036-vin-validation-and-the-knapsack-problem.html"&gt;Perl Weekly Challenge 036: VIN Validation and the Knapsack Problem&lt;/a&gt; by E. Choroba&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perlweeklychallenge</category>
    </item>
    <item>
      <title>Perl Weekly Challenge 035</title>
      <dc:creator>Kian Meng, Ang</dc:creator>
      <pubDate>Mon, 02 Dec 2019 12:34:06 +0000</pubDate>
      <link>https://dev.to/kianmeng/perl-weekly-challenge-035-3p40</link>
      <guid>https://dev.to/kianmeng/perl-weekly-challenge-035-3p40</guid>
      <description>&lt;p&gt;Originally published in &lt;a href="https://www.kianmeng.org/2019/11/perl-weekly-challenge-035-2019-week-48.html"&gt;kianmeng.org&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-035/"&gt;Perl Weekly Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continues from &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-034/"&gt;previous week&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/manwar/perlweeklychallenge"&gt;submit a merge request or open a ticket&lt;/a&gt; if you found any issues with this post. We highly appreciate and welcome your feedback.&lt;/p&gt;

&lt;p&gt;For a quick overview, go through the &lt;a href="https://perlweeklychallenge.org//blog/perl-weekly-challenge-035/"&gt;original tasks&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org//blog/recap-challenge-035/"&gt;recap&lt;/a&gt; of the weekly challenge.&lt;/p&gt;

&lt;p&gt;Additional feedback to the our Perl Weekly Challenge’s &lt;a href="https://twitter.com/perlwchallenge?lang=en"&gt;Twitter account&lt;/a&gt; is much appreciated.&lt;/p&gt;

&lt;h1&gt;
  
  
  Task #1
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Term::ANSIColor"&gt;&lt;code&gt;Term::ANSIColor&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Term::ANSIScreen"&gt;&lt;code&gt;Term::ANSIScreen&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Term::Size::Perl"&gt;&lt;code&gt;Term::Size::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::More"&gt;&lt;code&gt;Test::More&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Text::Morse"&gt;&lt;code&gt;Text::Morse&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Text::Trim"&gt;&lt;code&gt;Text::Trim&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Time::HiRes"&gt;&lt;code&gt;Time::HiRes&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/autodie"&gt;&lt;code&gt;autodie&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/constant"&gt;&lt;code&gt;constant&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/experimental"&gt;&lt;code&gt;experimental&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/lib"&gt;&lt;code&gt;lib&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you need to have a quick overview on which submitted solutions to read or study, look at the submissions by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/andrezgz/perl5/ch-1.pl"&gt;Andrezgz&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/javier-luque/perl5/ch-1.pl"&gt;Javier Luque&lt;/a&gt;. Both solutions were rather easy to follow and read.&lt;/p&gt;

&lt;p&gt;Going through all the submissions, we observed two approaches used by participants to encode text into binary encoded &lt;a href="https://en.wikipedia.org/wiki/Morse_code"&gt;Morse code&lt;/a&gt;. The first was to generate the binary form from two signal durations (dots and dashes) dynamically. Participant who preferred this way were &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/petr-roubicek/perl5/ch-1.pl"&gt;Petr Roubicek&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/javier-luque/perl5/ch-1.pl"&gt;Javier Luque&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/ruben-westerberg/perl5/ch-1.pl"&gt;Ruben Westerberg&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/laurent-rosenfeld/perl5/ch-1.pl"&gt;Laurent Rosenfeld&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/ulrich-rieke/perl5/ch-1.pl"&gt;Ulrich Rieke&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/roger-bell-west/perl5/ch-1.pl"&gt;Roger Bell West&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/ryan-thompson/perl5/ch-1.pl"&gt;Ryan Thompson&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/andrezgz/perl5/ch-1.pl"&gt;Andrezgz&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/colin-crain/perl5/ch-1.pl"&gt;Colin Crain&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While the second was to use a pre-generate list of characters to binary lookup table. Participants who used such approach were &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/duane-powell/perl5/ch-1.pl"&gt;Duane Powell&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/adam-russell/perl5/ch-1.pl"&gt;Adam Russell&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/burkhard-nickels/perl5/ch-1.pl"&gt;Burkhard Nickels&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/jaldhar-h-vyas/perl5/ch-1.pl"&gt;Jaldhar H. Vyas&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/steven-wilson/perl5/ch-1.pl"&gt;Steven Wilson&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/giuseppe-terlizzi/perl5/ch-1.pl"&gt;Giuseppe Terlizzi&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/giuseppe-terlizzi/perl5/ch-1.pl"&gt;Giuseppe Terlizzi&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As usual, selected submissions that caught our attention worth the discussions.&lt;/p&gt;

&lt;p&gt;Only &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/ruben-westerberg/perl5/ch-1.pl"&gt;Ruben Westerberg&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt; used &lt;a href="https://perldoc.pl/functions/pack"&gt;&lt;code&gt;pack&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://perldoc.pl/functions/unpack"&gt;&lt;code&gt;unpack&lt;/code&gt;&lt;/a&gt; function to process binary data. The &lt;a href="https://perldoc.pl/perlpacktut"&gt;default Perl tutorial&lt;/a&gt; on this matter will shed some light on using these two functions.&lt;/p&gt;

&lt;p&gt;As usual, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/burkhard-nickels/perl5/ch-1.pl"&gt;Burkhard Nickels&lt;/a&gt; solved this week challenges using different CPAN modules to demonstrate Morse code in a visual manner. Read his very details write-up on how he tackle this challenge. While looking at his solution, we noticed that he used the CPAN module, &lt;code&gt;Term::Size::Perl&lt;/code&gt; to determine the width of the terminal. In comparison,&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/laurent-rosenfeld/perl5/ch-1.pl"&gt;Laurent Rosenfeld&lt;/a&gt; formatted the output to a predefined 80 characters as shown in code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;format80c&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;s/(.{80})/$1\n/gr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/ryan-thompson/perl5/ch-1.pl"&gt;Ryan Thompson&lt;/a&gt; was the only participant that &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/ryan-thompson/extras/fetch-morse.pl"&gt;wrote a script&lt;/a&gt; that download, parse, and generate the Morse code into Perl script from Wikipedia page. While the script itself was far more complex that the actual solution, we can learn a few Perl tricks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/colin-crain/perl5/ch-1.pl"&gt;Colin Crain&lt;/a&gt; solution demonstrated that writing a proper program according to a specification or standard, in this case, &lt;a href="https://www.itu.int/rec/R-REC-M.1677-1-200910-I/"&gt;M.1677 : International Morse code&lt;/a&gt; was a tedious effort.&lt;/p&gt;

&lt;h1&gt;
  
  
  Task #2
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::More"&gt;&lt;code&gt;Test::More&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/autodie"&gt;&lt;code&gt;autodie&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/constant"&gt;&lt;code&gt;constant&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/experimental"&gt;&lt;code&gt;experimental&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/lib"&gt;&lt;code&gt;lib&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since this task was similar to Task 1 but done in reverse way (some reverse the lookup table), most of the participants reuse the same code when decoding Morse code. However, there were a selected few submissions we can read and learn from.&lt;/p&gt;

&lt;p&gt;Again, start with the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/javier-luque/perl5/ch-2.pl"&gt;Javier Luque&lt;/a&gt;. Submission with error handling and correction was easy to read and understand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/andrezgz/perl5/ch-2.pl"&gt;Andrezgz&lt;/a&gt; applied the Dispatch table (in past challenge) when decoding the Morse code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;morse_bin_inv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;add_dot&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# dot&lt;/span&gt;
        &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;111&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;add_dash&lt;/span&gt;  &lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# dash&lt;/span&gt;
        &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;     &lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# intra-character gap&lt;/span&gt;
        &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;000&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;add_char&lt;/span&gt;  &lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# character gap&lt;/span&gt;
        &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0000000&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;add_word&lt;/span&gt;  &lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# word gap&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-035/colin-crain/perl5/ch-2.pl"&gt;Colin Crain&lt;/a&gt;, besides solving it against a specification, used a &lt;a href="https://en.wikipedia.org/wiki/Finite-state_machine"&gt;State Machine&lt;/a&gt; to decode the Morse signal continuously. This was probably the only comprehensive solution to handle exception with erroneous Morse code signal.&lt;/p&gt;

&lt;h1&gt;
  
  
  See Also
&lt;/h1&gt;

&lt;p&gt;(1) &lt;a href="https://perlchallenges.wordpress.com/2019/11/18/perl-weekly-challenge-035/"&gt;Perl Weekly Challenge - 035&lt;/a&gt; by Javier Luque&lt;br&gt;
(2) &lt;a href="https://raku-musings.com/morse-remorse.html"&gt;Morse and Remorse with Raku&lt;/a&gt; by Arne Sommer&lt;br&gt;
(3) &lt;a href="https://adamcrussell.livejournal.com/12177.html"&gt;Perl Weekly Challenge 035&lt;/a&gt; by Adam Russell&lt;br&gt;
(4) &lt;a href="//pearls.dyndnss.net"&gt;Perl Weekly Challenge #35&lt;/a&gt; by Burkhard Nickels&lt;br&gt;
(5) &lt;a href="http://blogs.perl.org/users/laurent_r/2019/11/perl-weekly-challenge-35-binary-encoded-morse-code.html"&gt;Perl Weekly Challenge 35: Binary Encoded Morse Code&lt;/a&gt; by Laurent Rosenfeld&lt;br&gt;
(6) &lt;a href="https://www.braincells.com/perl/2019/11/perl_weekly_challenge_week_35.html"&gt;Perl Weekly Challenge: Week 35&lt;/a&gt; by Jaldhar H. Vyas&lt;br&gt;
(7) &lt;a href="https://blog.firedrake.org/archive/2019/11/Perl_Weekly_Challenge_35__Binary_Morse_Code.html"&gt;Perl Weekly Challenge 35: Binary Morse Code&lt;/a&gt; by Roger Bell West&lt;br&gt;
(8) &lt;a href="http://blogs.perl.org/users/e_choroba/2019/11/perl-weekly-challenge-035-binary-morse-code.html"&gt;Perl Weekly Challenge 035: Binary Morse Code&lt;/a&gt; by E. Choroba&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perlweeklychallenge</category>
      <category>morsecode</category>
    </item>
    <item>
      <title>Perl Weekly Challenge 034</title>
      <dc:creator>Kian Meng, Ang</dc:creator>
      <pubDate>Mon, 25 Nov 2019 12:26:25 +0000</pubDate>
      <link>https://dev.to/kianmeng/perl-weekly-challenge-034-3nif</link>
      <guid>https://dev.to/kianmeng/perl-weekly-challenge-034-3nif</guid>
      <description>&lt;p&gt;Originally published in &lt;a href="https://www.kianmeng.org/2019/11/perl-weekly-challenge-034-2019-week-47.html"&gt;kianmeng.org&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-033/"&gt;Perl Weekly Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continues from &lt;a href="https://dev.to/blog/review-challenge-033/"&gt;previous week&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/manwar/perlweeklychallenge"&gt;submit a merge request or open a ticket&lt;/a&gt; if you found any issues with this post. We highly appreciate and welcome your feedback.&lt;/p&gt;

&lt;p&gt;For a quick overview, go through the &lt;a href="https://dev.to/blog/perl-weekly-challenge-034/"&gt;original tasks&lt;/a&gt; and &lt;a href="https://dev.to/blog/recap-challenge-034/"&gt;recap&lt;/a&gt; of the weekly challenge.&lt;/p&gt;

&lt;p&gt;Additional feedback to the our Perl Weekly Challenge’s &lt;a href="https://twitter.com/perlwchallenge?lang=en"&gt;Twitter account&lt;/a&gt; is much appreciated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN&lt;/strong&gt; modules used: &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Long"&gt;&lt;code&gt;Getopt::Long&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Modern::Perl"&gt;&lt;code&gt;Modern::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL"&gt;&lt;code&gt;PDL&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::Core"&gt;&lt;code&gt;PDL::Core&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::IO::Image"&gt;&lt;code&gt;PDL::IO::Image&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::ImageRGB"&gt;&lt;code&gt;PDL::ImageRGB&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::NiceSlice"&gt;&lt;code&gt;PDL::NiceSlice&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While this may seem like a simple task, it's a good example of showing how Perl handles slicing for an Array or Hash. From all the submissions, we can group the solution into two categories of showing how slicing works in Perl language itself or through a practical example.&lt;/p&gt;

&lt;p&gt;For the first category, start with the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/mark-anderson/perl5/ch-1.pl"&gt;Mark Anderson&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/javier-luque/perl5/ch-1.pl"&gt;Javier Luque&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/adam-russell/perl5/ch-1.pl"&gt;Adam Russell&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/laurent-rosenfeld/perl5/ch-1.pl"&gt;Laurent Rosenfeld&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt;. Next, look into the submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/ruben-westerberg/perl5/ch-1.pl"&gt;Ruben Westerberg&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/steven-wilson/perl5/ch-1.pl"&gt;Steven Wilson&lt;/a&gt; where both demonstrated array and hash slicing using different range of values and edge cases.&lt;/p&gt;

&lt;p&gt;For the second category, look into different examples that illustrated the usage of slicing array and/or hash. These examples include image processing by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/burkhard-nickels/perl5/ch-1.pl"&gt;Burkhard Nickels&lt;/a&gt;, binary search by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/jaldhar-h-vyas/perl5/ch-1.pl"&gt;Jaldhar H. Vyas&lt;/a&gt;, superheroes names by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/andrezgz/perl5/ch-1.pl"&gt;Andrezgz&lt;/a&gt;, prime numbers generator by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/colin-crain/perl5/ch-1.pl"&gt;Colin Crain&lt;/a&gt;, sovereign states by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/petr-roubicek/perl5/ch-1.pl"&gt;Petr Roubicek&lt;/a&gt;, card shuffling by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/duane-powell/perl5/ch-1.pl"&gt;Duane Powell&lt;/a&gt;, and user listing by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/dave-cross/perl5/ch-1.pl"&gt;Dave Cross&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And kudos given to &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/dave-cross/perl5/ch-1.pl"&gt;Dave Cross&lt;/a&gt; for his solution that demonstrated both list and hash slicing in one line of code as shown below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="c1"&gt;# Lvalue is a hash slice&lt;/span&gt;
    &lt;span class="c1"&gt;# Rvalue is a list slice&lt;/span&gt;
    &lt;span class="nv"&gt;@user&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sx"&gt;qw[user id shell]&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;split&lt;/span&gt; &lt;span class="sr"&gt;/:/&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Lastly, for good write-up on this topic, read the comment by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/colin-crain/perl5/ch-1.pl"&gt;Colin Crain&lt;/a&gt; and the details blog post by both &lt;a href="http://blogs.perl.org/users/e_choroba/2019/11/perl-weekly-challenge-034-slices-and-a-dispatch-table.html"&gt;E. Choroba&lt;/a&gt; and &lt;a href="http://blogs.perl.org/users/laurent_r/2019/11/perl-weekly-challenge-34-array-and-hash-slices-and-dispatch-tables.html"&gt;Laurent Rosenfeld&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN&lt;/strong&gt; modules used: &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Long"&gt;&lt;code&gt;Getopt::Long&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL"&gt;&lt;code&gt;PDL&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::Core"&gt;&lt;code&gt;PDL::Core&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::IO::Image"&gt;&lt;code&gt;PDL::IO::Image&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::ImageRGB"&gt;&lt;code&gt;PDL::ImageRGB&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::NiceSlice"&gt;&lt;code&gt;PDL::NiceSlice&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the past challenges, we've discussed about &lt;a href="https://en.wikipedia.org/wiki/Dispatch_table"&gt;Dispatch table&lt;/a&gt;, which is just a table with pointers to function or method. Implementation in Perl is rather easy, just a hash to function pointers.&lt;/p&gt;

&lt;p&gt;For a quick understanding on how it being used in Perl, start with the submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/adam-russell/perl5/ch-2.pl"&gt;Adam Russell&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/ruben-westerberg/perl5/ch-2.pl"&gt;Ruben Westerberg&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/steven-wilson/perl5/ch-2.pl"&gt;Steven Wilson&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/e-choroba/perl5/ch-2.pl"&gt;E. Choroba&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more complex practical examples of Dispatch table implementation, look into the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/dave-cross/perl5/ch-2.pl"&gt;Dave Cross&lt;/a&gt; (console calculator), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/javier-luque/perl5/ch-2.pl"&gt;Javier Luque&lt;/a&gt; (calculator), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/duane-powell/perl5/ch-2.pl"&gt;Duane Powell&lt;/a&gt; (card shuffling), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/burkhard-nickels/perl5/ch-2.pl"&gt;Burkhard Nickels&lt;/a&gt; (console command), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/laurent-rosenfeld/perl5/ch-2.pl"&gt;Laurent Rosenfeld&lt;/a&gt; (dictionary), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/jaldhar-h-vyas/perl5/ch-2.pl"&gt;Jaldhar H. Vyas&lt;/a&gt; (Rock paper scissors game), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/roger-bell-west/perl5/ch-2.pl"&gt;Roger Bell West&lt;/a&gt; (expression evaluator), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/andrezgz/perl5/ch-2.pl"&gt;Andrezgz&lt;/a&gt; (superheroes name), and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-034/colin-crain/perl5/ch-2.pl"&gt;Colin Crain&lt;/a&gt; (another console calculator, yes this was a popular choice among participants).&lt;/p&gt;

&lt;h3&gt;
  
  
  See Also
&lt;/h3&gt;

&lt;p&gt;(1) &lt;a href="https://perlchallenges.wordpress.com/2019/11/11/perl-weekly-challenge-034/"&gt;Perl Weekly Challenge - 034&lt;/a&gt; by Javier Luque&lt;br&gt;
(2) &lt;a href="https://raku-musings.com/sliced-dispatch.html"&gt;Sliced Dispatch, The Raku Way&lt;/a&gt; by Arne Sommer&lt;br&gt;
(3) &lt;a href="https://adamcrussell.livejournal.com/11703.html"&gt;Perl Weekly Challenge 034&lt;/a&gt; by Adam Russell&lt;br&gt;
(4) &lt;a href="http://46.91.226.185:81/www/Perl/PWC/20191111_34/ch-1.html"&gt;Perl Weekly Challenge #34&lt;/a&gt; by Burkhard Nickels&lt;br&gt;
(5) &lt;a href="http://blogs.perl.org/users/laurent_r/2019/11/perl-weekly-challenge-34-array-and-hash-slices-and-dispatch-tables.html"&gt;Perl Weekly Challenge 34: Array and Hash Slices and Dispatch Tables&lt;/a&gt; by Laurent Rosenfeld&lt;br&gt;
(6) &lt;a href="https://www.braincells.com/perl/2019/11/perl_weekly_challenge_week_34.html"&gt;Perl Weekly Challenge: Week 34&lt;/a&gt; by Jaldhar H. Vyas&lt;br&gt;
(7) &lt;a href="http://blogs.perl.org/users/e_choroba/2019/11/perl-weekly-challenge-034-slices-and-a-dispatch-table.html"&gt;Perl Weekly Challenge 034: Slices and a Dispatch Table&lt;/a&gt; by E. Choroba&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perweeklychallenge</category>
    </item>
    <item>
      <title>
Perl Weekly Challenge 033</title>
      <dc:creator>Kian Meng, Ang</dc:creator>
      <pubDate>Tue, 19 Nov 2019 16:59:22 +0000</pubDate>
      <link>https://dev.to/kianmeng/perl-weekly-challenge-033-1e82</link>
      <guid>https://dev.to/kianmeng/perl-weekly-challenge-033-1e82</guid>
      <description>&lt;p&gt;Originally published in &lt;a href="https://www.kianmeng.org/2019/11/perl-weekly-challenge-033-2019-week-46.html"&gt;kianmeng.org&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-033/"&gt;Perl Weekly Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continues from &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-032/"&gt;previous week&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/manwar/perlweeklychallenge"&gt;submit a merge request or open a ticket&lt;/a&gt; if you found any issues with this post. We highly appreciate and welcome your feedback.&lt;/p&gt;

&lt;p&gt;For a quick overview, go through the &lt;a href="https://dev.to/blog/perl-weekly-challenge-033/"&gt;original tasks&lt;/a&gt; and &lt;a href="https://dev.to/blog/recap-challenge-033/"&gt;recap&lt;/a&gt; of the weekly challenge.&lt;/p&gt;

&lt;p&gt;Additional feedback to the our Perl Weekly Challenge's &lt;a href="https://twitter.com/perlwchallenge?lang=en"&gt;Twitter account&lt;/a&gt; is much appreciated.&lt;/p&gt;




&lt;h3&gt;
  
  
  Task #1
&lt;/h3&gt;




&lt;p&gt;&lt;strong&gt;CPAN&lt;/strong&gt; modules used: &lt;a href="https://metacpan.org/pod/Const::Fast"&gt;&lt;code&gt;Const::Fast&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/English"&gt;&lt;code&gt;English&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Long"&gt;&lt;code&gt;Getopt::Long&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/IO::All"&gt;&lt;code&gt;IO::All&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Modern::Perl"&gt;&lt;code&gt;Modern::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Mojo::File"&gt;&lt;code&gt;Mojo::File&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was similar to last week challenge but at different granularity, counting character instead of word. Hence, those participants who've submitted their solutions last week will only need to tweak their answer a bit. Is there anything we can learn or observe for this week challenge? Yes, and quite a few things. This week we will compare similar approach between two or more participants which either share similar approach in solving the task or totally using the opposite way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/fabrizio-poggi/perl5/ch-1.pl"&gt;Fabrizio Poggi&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/dave-cross/perl5/ch-1.pl"&gt;Dave Cross&lt;/a&gt; showed us the opposite way of solving the problem through either hard-coded or dynamic way. A simple example of not using a loop against a loop. The submission by Fabrizio can be further refactored using the range of alphabet characters &lt;code&gt;a..z&lt;/code&gt; as found in solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/duane-powell/perl5/ch-1.pl"&gt;Duane Powell&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/duncan-c-white/perl5/ch-1.pl"&gt;Duncan C. White&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt; have similar approach which use double &lt;code&gt;while&lt;/code&gt; loop to split and count the frequency of character. The different was the coding style.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/andrezgz/perl5/ch-1.pl"&gt;Andrezgz&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/colin-crain/perl5/ch-1.pl"&gt;Colin Crain&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/bwva/perl5/ch-1.pl"&gt;Bwva&lt;/a&gt; took the same approach of finding all characters in a line from a file, splitting it into an array of characters, and lowercase it before counting the frequency. Again, subtle differences in the personal coding style between them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/adam-russell/perl5/ch-1.pl"&gt;Adam Russell&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/ndelucca/perl5/ch-1.pl"&gt;Ndelucca&lt;/a&gt; also have a similar approach but the latter did it in a more dense and shorter version using &lt;a href="https://perldoc.perl.org/functions/map.html"&gt;&lt;code&gt;map&lt;/code&gt;&lt;/a&gt; function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/steven-wilson/perl5/ch-1.pl"&gt;Steven Wilson&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/burkhard-nickels/perl5/ch-1.pl"&gt;Burkhard Nickels&lt;/a&gt;. Between a solution that was written in an explicit manner against a implicit Perl one-liner. For maintainable code, the former is a better approach. &lt;a href="http://blogs.perl.org/users/laurent_r/2019/11/perl-weekly-challenge-33-count-letters-and-multiplication-tables.html"&gt;Laurent Rosenfeld&lt;/a&gt; also have a few one-liner examples.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/mark-anderson/perl5/ch-1.pl"&gt;Mark Anderson&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/burkhard-nickels/perl5/ch-1.pl"&gt;Burkhard Nickels&lt;/a&gt; on using different CPAN modules to read the input file. &lt;code&gt;Mojo::File&lt;/code&gt; and &lt;code&gt;IO::All&lt;/code&gt;, which is the better choice or we just stick to &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; then?&lt;/p&gt;

&lt;p&gt;Some rather unique approach we noticed. The use of &lt;a href="https://perldoc.perl.org/functions/getc.html"&gt;&lt;code&gt;getc&lt;/code&gt;&lt;/a&gt; by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/javier-luque/perl5/ch-1.pl"&gt;Javier Luque&lt;/a&gt; to read the next character of a file handler. And the use of &lt;a href="https://perldoc.perl.org/perluniprops.html#Properties-accessible-through-%5cp%7b%7d-and-%5cP%7b%7d"&gt;&lt;code&gt;\P{Alpha}&lt;/code&gt;&lt;/a&gt; by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/joelle-maslak/perl5/ch-1.pl"&gt;Joelle Maslak&lt;/a&gt; and &lt;a href="https://perldoc.perl.org/perluniprops.html#Properties-accessible-through-%5cp%7b%7d-and-%5cP%7b%7d"&gt;&lt;code&gt;\p{XPosixLower}&lt;/code&gt;&lt;/a&gt; that matches the full range of Unicode or non-English characters that are considered as alphabetic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN&lt;/strong&gt; modules used: &lt;a href="https://metacpan.org/pod/Const::Fast"&gt;&lt;code&gt;Const::Fast&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Long"&gt;&lt;code&gt;Getopt::Long&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Modern::Perl"&gt;&lt;code&gt;Modern::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL"&gt;&lt;code&gt;PDL&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/PDL::NiceSlice"&gt;&lt;code&gt;PDL::NiceSlice&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Perl6::Form"&gt;&lt;code&gt;Perl6::Form&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/open"&gt;&lt;code&gt;open&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've something similar and quite humourous in the past challenges, just show the result as it. And this week, that solution came from &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/lubos-kolouch/perl5/ch-2.pl"&gt;Lubos Kolouch&lt;/a&gt;. We can understand the difficulty of calculating, formatting, and displaying the multiplication table for this task.&lt;/p&gt;

&lt;p&gt;For code readability (subjective view) and density, we found the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/duncan-c-white/perl5/ch-2.pl"&gt;Duncan C. White&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/e-choroba/perl5/ch-2.pl"&gt;E. Choroba&lt;/a&gt; were easier to follow compare to others.&lt;/p&gt;

&lt;p&gt;Instead of &lt;a href="https://perldoc.perl.org/functions/printf.html"&gt;&lt;code&gt;printf&lt;/code&gt;&lt;/a&gt; function to format the layout of the table, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/adam-russell/perl5/ch-2.pl"&gt;Adam Russell&lt;/a&gt; opted for alternative solution using the &lt;code&gt;Perl6::Form&lt;/code&gt; CPAN module.&lt;/p&gt;

&lt;p&gt;Look into the submission by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-033/burkhard-nickels/perl5/ch-2.pl"&gt;Burkhard Nickels&lt;/a&gt; where he tried different approaches to generate the table. We love the use of &lt;code&gt;PDL&lt;/code&gt; and &lt;code&gt;PDL::NiceSlice&lt;/code&gt; CPAN module as well as his write-up on comparing different alternative ways in generating the multiplication table.&lt;/p&gt;

&lt;h3&gt;
  
  
  See Also
&lt;/h3&gt;

&lt;p&gt;(1) &lt;a href="https://perlchallenges.wordpress.com/2019/11/05/perl-weekly-challenge-033/"&gt;Perl Weekly Challenge – 033&lt;/a&gt; by Javier Luque&lt;br&gt;
(2) &lt;a href="https://raku-musings.com/add-mul.html"&gt;Addition and Multiplication with Raku&lt;/a&gt; by Arne Sommer&lt;br&gt;
(3) &lt;a href="https://adamcrussell.livejournal.com/11383.html"&gt;Perl Weekly Challenge 033&lt;/a&gt; by Adam Russell&lt;br&gt;
(4) &lt;a href="http://46.91.236.80:81/www/Perl/PWC/20191108_33/pwc33.html"&gt;Perl Weekly Challenge #33 Task #1: Count letters&lt;/a&gt; by Burkhard Nickels&lt;br&gt;
(5) &lt;a href="http://blogs.perl.org/users/laurent_r/2019/11/perl-weekly-challenge-33-count-letters-and-multiplication-tables.html"&gt;Perl Weekly Challenge 33: Count letters and Multiplication Tables&lt;/a&gt; by Laurent Rosenfeld&lt;br&gt;
(6) &lt;a href="https://www.braincells.com/perl/2019/11/perl_weekly_challenge_week_33.html"&gt;Perl Weekly Challenge: Week 33&lt;/a&gt; by Jaldhar H. Vyas&lt;br&gt;
(7) &lt;a href="https://blog.firedrake.org/archive/2019/11/Perl_Weekly_Challenge_33.html"&gt;RogerBW's Blog: Perl Weekly Challenge 33&lt;/a&gt; by Roger Bell West&lt;br&gt;
(8) &lt;a href="http://blogs.perl.org/users/e_choroba/2019/11/perl-weekly-challenge-033-count-letters-formatted-multiplication-table.html"&gt;Perl Weekly Challenge 033: Count Letters &amp;amp; Formatted Multiplication Table&lt;/a&gt; by E. Choroba&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perlweeklychallenge</category>
    </item>
    <item>
      <title>Perl Weekly Challenge 032</title>
      <dc:creator>Kian Meng, Ang</dc:creator>
      <pubDate>Sun, 10 Nov 2019 15:03:03 +0000</pubDate>
      <link>https://dev.to/kianmeng/perl-weekly-challenge-032-review-4o3g</link>
      <guid>https://dev.to/kianmeng/perl-weekly-challenge-032-review-4o3g</guid>
      <description>&lt;p&gt;Originally published in &lt;a href="https://www.kianmeng.org/2019/11/perl-weekly-challenge-032-2019-week-45.html"&gt;kianmeng.org&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-032/"&gt;Perl Weekly Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continues from &lt;a href="https://perlweeklychallenge.org/blog/review-challenge-031/"&gt;previous week&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/manwar/perlweeklychallenge"&gt;submit a merge request or open a ticket&lt;/a&gt; if you found any issues with this post. We highly appreciate and welcome your feedback.&lt;/p&gt;

&lt;p&gt;For a quick overview, go through the &lt;a href="https://perlweeklychallenge.org/blog/perl-weekly-challenge-032/"&gt;original tasks&lt;/a&gt; and &lt;a href="https://perlweeklychallenge.org/blog/recap-challenge-032/"&gt;recap&lt;/a&gt; of the weekly challenge.&lt;/p&gt;

&lt;p&gt;Additional feedback to the our Perl Weekly Challenge's &lt;a href="https://twitter.com/perlwchallenge?lang=en"&gt;Twitter account&lt;/a&gt; is much appreciated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Const::Fast"&gt;&lt;code&gt;Const::Fast&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/English"&gt;&lt;code&gt;English&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Long"&gt;&lt;code&gt;Getopt::Long&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Std"&gt;&lt;code&gt;Getopt::Std&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Modern::Perl"&gt;&lt;code&gt;Modern::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Term::Size::Perl"&gt;&lt;code&gt;Term::Size::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Text::CSV_XS"&gt;&lt;code&gt;Text::CSV_XS&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/open"&gt;&lt;code&gt;open&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A rather common (there is even a &lt;a href="https://perldoc.pl/perlfaq6#How-can-I-print-out-a-word-frequency-or-line-frequency-summary"&gt;FAQ&lt;/a&gt;, link via &lt;a href="http://blogs.perl.org/users/e_choroba/2019/11/perl-weekly-challenge-032-frequency-table-ascii-bar-chart.html"&gt;E. Chroba&lt;/a&gt;) task to demonstrate Perl's text manipulation capabilities. Common approach used by most participants can be break down into several steps consists of read each line from standard input, clean up each line, count the frequency of the word, sort the frequency count, and lastly show the result in both normal and CSV output. The solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/adam-russell/perl5/ch-1.pl"&gt;Adam Russell&lt;/a&gt; and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/dave-cross/perl5/ch-1.pl"&gt;Dave Cross&lt;/a&gt; demonstrated this succinctly with no dependencies on CPAN modules or special features. And yes, start reading these solutions first before you proceed with other.&lt;/p&gt;

&lt;p&gt;Beside that, there were other solutions in one-liner that can quickly show the approach to solve this task as shown below.&lt;/p&gt;

&lt;p&gt;In &lt;a href="http://blogs.perl.org/users/e_choroba/2019/11/perl-weekly-challenge-032-frequency-table-ascii-bar-chart.html"&gt;Bash&lt;/a&gt; by E. Choroba. Yes, using Unix pipe which demonstrated core concepts of &lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy"&gt;Unix philosophy&lt;/a&gt; of writing one program to do one thing very well and make sure all can work together through text streams.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;    &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In &lt;a href="http://46.91.236.80:81/www/Perl/PWC/20191028_32/pwc32.html"&gt;Perl&lt;/a&gt; by Burkhard Nickels.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;perl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;lne&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$sum{$_}++; END { foreach( sort { $sum{$b} &amp;lt;=&amp;gt; $sum{$a} } keys %sum ) { print "$i\t$sum{$i}"; } }&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="nv"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Unfortunately, we don't live in the perfect world. There is always this issue of &lt;a href="https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"&gt;garbage in, garbage out (GIGO)&lt;/a&gt; during text processing. Hence, we noticed different defensive measurements to handle possible edge cases were used by participants. And it showed that, to a certain extend, to handle numerous edges cases, Bash script may not be a convenient or suitable choice compare to Perl script.&lt;/p&gt;

&lt;p&gt;For examples, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/anton-fedotov/perl5/ch-1.pl"&gt;Anton Fedotov&lt;/a&gt; (UTF-8 support in both input and output), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/duane-powell/perl5/ch-1.pl"&gt;Duane Powell&lt;/a&gt; (non-alphabet characters removal and multiple words within a line support), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/dave-jacoby/perl5/ch-1.pl"&gt;Dave Jacoby&lt;/a&gt; (accept source from file or &lt;a href="https://en.wikipedia.org/wiki/Standard_streams#Standard_input_(stdin)"&gt;Standard Input (stdin)&lt;/a&gt;), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/laurent-rosenfeld/perl5/ch-1.pl"&gt;Laurent Rosenfeld&lt;/a&gt; (skip empty line), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/prajith-p/perl5/ch-1.pl"&gt;Prajith P&lt;/a&gt; (another way to skip empty line without regex and multiple source files support), &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt; (alternative UTF-8 support), and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/athanasius/perl5/ch-1.pl"&gt;Athanasius&lt;/a&gt; (check input for different OS).&lt;/p&gt;

&lt;p&gt;If you're new to Perl or favour to be more explicit, look into the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/jaldhar-h-vyas/perl5/ch-1.pl"&gt;Jaldhar H. Vyas&lt;/a&gt; which used &lt;code&gt;English&lt;/code&gt; CPAN module which avoid the use of ugly &lt;a href="https://perldoc.perl.org/perlvar.html"&gt;punctuation variables&lt;/a&gt;. Ovid wrote a &lt;a href="http://blogs.perl.org/users/ovid/2016/05/why-i-try-to-avoid-perls-punctuation-variables.html"&gt;blog post&lt;/a&gt; on this subject as well. For comparison, we can see the differences of those submissions which used punctuation variables like &lt;code&gt;$!&lt;/code&gt; or &lt;code&gt;$ERRNO&lt;/code&gt; (&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/anton-fedotov/perl5/ch-1.pl"&gt;Anton Fedotov&lt;/a&gt;), &lt;code&gt;$~&lt;/code&gt; or &lt;code&gt;$FORMAT_NAME&lt;/code&gt; (&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/fabrizio-poggi/perl5/ch-1.pl"&gt;Fabrizio Poggi&lt;/a&gt;), &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; or &lt;code&gt;ARGV&lt;/code&gt; (&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/rage311/perl5/ch-1.pl"&gt;Rage311&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/roger-bell-west/perl5/ch-1.pl"&gt;Roger Bell West&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/andrezgz/perl5/ch-1.pl"&gt;Andrezgz&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/ryan-thompson/perl5/ch-1.pl"&gt;Ryan Thompson&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/duncan-c-white/perl5/ch-1.pl"&gt;Duncan C White&lt;/a&gt;), &lt;code&gt;$|&lt;/code&gt; or &lt;code&gt;$OUTPUT_AUTOFLUSH&lt;/code&gt; (&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/athanasius/perl5/ch-1.pl"&gt;Athanasius&lt;/a&gt;), and &lt;code&gt;$^O&lt;/code&gt; or &lt;code&gt;$OSNAME&lt;/code&gt; (&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/athanasius/perl5/ch-1.pl"&gt;Athanasius&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Another good comparison of explicit vs. implicit coding style was on reading a file by line and count the word frequency.&lt;/p&gt;

&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/dave-cross/perl5/ch-1.pl"&gt;Dave Cross&lt;/a&gt; which was quite common style among all participants.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;chomp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/andrezgz/perl5/ch-1.pl"&gt;Andrezgz&lt;/a&gt; which was short and dense code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;chomp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$entries&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;# count instances&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;By &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/steven-wilson/perl5/ch-1.pl"&gt;Steven Wilson&lt;/a&gt; which was more explicit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@ARGV&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Can't open &amp;lt; &lt;/span&gt;&lt;span class="si"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;: $!&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;eof&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$word&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;readline&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nb"&gt;chomp&lt;/span&gt; &lt;span class="nv"&gt;$word&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nv"&gt;$word_count&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$word&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For submission with heavy used of CPAN modules but still short and simple, the solution by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/e-choroba/perl5/ch-1.pl"&gt;E. Choroba&lt;/a&gt; was a good example to show case this.&lt;/p&gt;

&lt;p&gt;Lastly, once you've familiarized yourself with all the submitted solutions of this task, read the answer by &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/burkhard-nickels/perl5/ch-1.pl"&gt;Burkhard Nickels&lt;/a&gt;. Burkhard have submitted a comprehensive solution with numerous features for this task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CPAN modules used:&lt;/strong&gt; &lt;a href="https://metacpan.org/pod/Const::Fast"&gt;&lt;code&gt;Const::Fast&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Data::Dumper"&gt;&lt;code&gt;Data::Dumper&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Function::Parameters"&gt;&lt;code&gt;Function::Parameters&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Long"&gt;&lt;code&gt;Getopt::Long&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Getopt::Std"&gt;&lt;code&gt;Getopt::Std&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/JSON::PP"&gt;&lt;code&gt;JSON::PP&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/List::Util"&gt;&lt;code&gt;List::Util&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Math::Round"&gt;&lt;code&gt;Math::Round&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Modern::Perl"&gt;&lt;code&gt;Modern::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Moo"&gt;&lt;code&gt;Moo&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Term::ReadKey"&gt;&lt;code&gt;Term::ReadKey&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Term::Size::Perl"&gt;&lt;code&gt;Term::Size::Perl&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Types::Standard"&gt;&lt;code&gt;Types::Standard&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/autodie"&gt;&lt;code&gt;autodie&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/constant"&gt;&lt;code&gt;constant&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/experimental"&gt;&lt;code&gt;experimental&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/feature"&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/namespace::clean"&gt;&lt;code&gt;namespace::clean&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/strict"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/utf8"&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/warnings"&gt;&lt;code&gt;warnings&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another rather straightforward task where we need to sort the list of item by name or values and generate a histogram graph at the console. Due to similarity of this task with previous task, some participants decided to reuse and extend the existing code in task 1.&lt;/p&gt;

&lt;p&gt;For implementing different sorting strategies, we've observed different approaches.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/duane-powell/perl5/ch-2.pl"&gt;Duane Powell&lt;/a&gt; used a simple if-else to sort the output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="c1"&gt;# sort and print lines&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$by_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;# sort by key&lt;/span&gt;
        &lt;span class="nv"&gt;generate_bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$format&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;lc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;cmp&lt;/span&gt; &lt;span class="nb"&gt;lc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]}));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;# sort by value&lt;/span&gt;
        &lt;span class="nv"&gt;generate_bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$format&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]}));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/lars-balker/perl5/ch-2.pl"&gt;Lars Balker&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/javier-luque/perl5/ch-2.pl"&gt;Javier Luque&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/giuseppe-terlizzi/perl5/ch-2.pl"&gt;Giuseppe Terlizzi&lt;/a&gt; used similar approach but with anonymous sorting subroutine.&lt;/p&gt;

&lt;p&gt;For &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/lars-balker/perl5/ch-2.pl"&gt;Lars Balker&lt;/a&gt; where the if-else have been replaced with ternary operations and anonymous subroutines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$sort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$order_by_label&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="ow"&gt;cmp&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="ow"&gt;cmp&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$word&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nv"&gt;$sort&lt;/span&gt; &lt;span class="nb"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$word&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;$sum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;%*s | %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nv"&gt;$maxlength&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$hashes&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$pct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/javier-luque/perl5/ch-2.pl"&gt;Javier Luque&lt;/a&gt; with flexibility to add more sorting fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="c1"&gt;# Sorting function - just 2 for now&lt;/span&gt;
    &lt;span class="nv"&gt;$sort_func&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$::b&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$::a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="ow"&gt;eq&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;size&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
    &lt;span class="nv"&gt;$sort_func&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$::a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;cmp&lt;/span&gt; &lt;span class="nv"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$::b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="ow"&gt;eq&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;

    &lt;span class="c1"&gt;# Print the chart&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nv"&gt;$sort_func&lt;/span&gt; &lt;span class="nb"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;%10s | %s &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt;
        &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;scalar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The more advance and Object-Oriented approach was seen in &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/e-choroba/perl5/ch-2.pl"&gt;E. Choroba&lt;/a&gt;. Instead of if-else statement, a hash was used as a lookup table to delegate to different sorting strategy subroutines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="nv"&gt;method&lt;/span&gt; &lt;span class="nv"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;SortBy&lt;/span&gt; &lt;span class="nv"&gt;$sort_by&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;')&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;values&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$sort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;labels&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;_by_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s"&gt;values&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;_by_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s"&gt;labels_desc&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;_by_key_desc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s"&gt;values_desc&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;_by_value_desc&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$sort_by&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$sort&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nb"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;_max_length&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;s%s%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt;
              &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;separator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;_bar_width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;$max&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Another thing we've noticed where participants have put extra effort in scaling the histogram due to different range of values (&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/ndelucca/perl5/ch-2.pl"&gt;Ndelucca&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/lars-balker/perl5/ch-2.pl"&gt;Lars Balker&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/adam-russell/perl5/ch-2.pl"&gt;Adam Russell&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/athanasius/perl5/ch-2.pl"&gt;Athanasius&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/laurent-rosenfeld/perl5/ch-2.pl"&gt;Laurent Rosenfeld&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/prajith-p/perl5/ch-2.pl"&gt;Prajith P&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/lars-thegler/perl5/ch-2.pl"&gt;Lars Thegler&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/ulrich-rieke/perl5/ch-2.pl"&gt;Ulrich Rieke&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/jaldhar-h-vyas/perl5/ch-2.pl"&gt;Jaldhar H Vyas&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/roger-bell-west/perl5/ch-2.pl"&gt;Roger Bell West&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/ryan-thompson/perl5/ch-2.pl"&gt;Ryan Thompson&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/duncan-c-white/perl5/ch-2.pl"&gt;Duncan C White&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/andrezgz/perl5/ch-2.pl"&gt;Andrezgz&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/giuseppe-terlizzi/perl5/ch-2.pl"&gt;Giuseppe Terlizzi&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/colin-crain/perl5/ch-2.pl"&gt;Colin Crain&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/joelle-maslak/perl5/ch-2.pl"&gt;Joelle Maslak&lt;/a&gt;), floating numbers (&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/ulrich-rieke/perl5/ch-2.pl"&gt;Ulrich Rieke&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/colin-crain/perl5/ch-2.pl"&gt;Colin Crain&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/joelle-maslak/perl5/ch-2.pl"&gt;Joelle Maslak&lt;/a&gt;), and terminal width (&lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/burkhard-nickels/perl5/ch-2.pl"&gt;Burkhard Nickels&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/roger-bell-west/perl5/ch-2.pl"&gt;Roger Bell West&lt;/a&gt;, &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/ryan-thompson/perl5/ch-2.pl"&gt;Ryan Thompson&lt;/a&gt;, and &lt;a href="https://github.com/manwar/perlweeklychallenge-club/blob/master/challenge-032/joelle-maslak/perl5/ch-2.pl"&gt;Joelle Maslak&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  See Also
&lt;/h3&gt;

&lt;p&gt;(1) &lt;a href="https://perlchallenges.wordpress.com/2019/10/31/perl-weekly-challenge-032/"&gt;Perl Weekly Challenge - 32&lt;/a&gt; by Javier Luque&lt;br&gt;
(2) &lt;a href="https://raku-musings.com/instance-bar.html"&gt;The Raku Instance Bar&lt;/a&gt; by Arne Sommer&lt;br&gt;
(3) &lt;a href="https://adamcrussell.livejournal.com/10802.html"&gt;Perl Weekly Challenge 032&lt;/a&gt; by Adam Russell&lt;br&gt;
(4) &lt;a href="http://46.91.236.80:81/www/Perl/PWC/20191028_32/pwc32.html"&gt;Perl Weekly Challenge #32, Number of occurences and bar chart&lt;/a&gt; by Burkhard Nickels&lt;br&gt;
(5) &lt;a href="http://blogs.perl.org/users/laurent_r/2019/10/perl-weekly-challenge-30-word-histogram-and-ascii-bar-chart.html"&gt;Perl Weekly Challenge 32: Word Histogram and ASCII Bar Chart&lt;/a&gt; by Laurent Rosenfeld&lt;br&gt;
(6) &lt;a href="https://www.braincells.com/perl/2019/11/perl_weekly_challenge_week_32.html"&gt;Perl Weekly Challenge: Week 32&lt;/a&gt; by Jaldhar H. Vyas&lt;br&gt;
(7) &lt;a href="https://blog.firedrake.org/archive/2019/11/Perl_Weekly_Challenge_32.html"&gt;RogerBW's Blog: Perl Weekly Challenge 32&lt;/a&gt; by Roger Bell West&lt;br&gt;
(8) &lt;a href="http://blogs.perl.org/users/e_choroba/2019/11/perl-weekly-challenge-032-frequency-table-ascii-bar-chart.html"&gt;Perl Weekly Challenge 032: Frequency Table &amp;amp; ASCII Bar Chart&lt;/a&gt; by E. Choroba&lt;/p&gt;

</description>
      <category>perl</category>
      <category>perlweeklychallenge</category>
    </item>
  </channel>
</rss>
