Spoiler Alert: This weekly challenge deadline is due in a few days from now (on July 30, 2023 at 23:59). This blog post offers some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.
Task 1: Friday 13th
You are given a year number in the range 1753 to 9999.
Write a script to find out how many dates in the year are Friday 13th, assume that the current Gregorian calendar applies.
Example
Input: $year = 2023
Output: 2
Since there are only 2 Friday 13th in the given year 2023 i.e. 13th Jan and 13th Oct.
Perl isn't a strongly typed language, and its built-in types are limited and not generally accessible to the engineer, however, Perl supports various classes of data and in recent years has flirted with various ways of enabling runtime type checking.
In a strongly typed language the tl;dr; case for declaring data types is memory management, compile-time code optimization, and correctness. To this day I'm both impressed and horrified by the number of errors caught when I implement some kind of type checking in my programs. When it comes to runtime type checking we're only concerned with enforcing correctness.
Types, values, objects, signatures, and the systems that tie these all together, are all inextricably bound. They are necessarily interdependent in order to present/provide a cohesive and consistent system. Peeling back the layers a bit, types are merely classifications of data. Any given piece of data can be classified as belonging to a particular type whether implicit or explicit.
Eagle-eyed watchers of CPAN may have noticed that I've recently been releasing Type::Tiny development releases with version numbers 1.999_XYZ.
Type::Tiny v2 is intended to be compatible with Type::Tiny v1. If you've used Type::Tiny v1, you shouldn't need to change any code, but Type::Tiny v2 has a few new features which may make your code simpler, more maintainable, and more readable if you adopt them.
If you ever wanted to contribute to a Perl project now is a good time to give it a go!. Here are a few beginner friendly projects that are up-for-grabs and here is a list of Github projects with the "hacktoberfest' topic.
If you are a project owner and would like someone to participate in your project make sure to add the 'hacktoberfest" topic to a github/gitlab issue and promote your project on ( blogs.perl.org, perl.com/ ,Perlweekly, Perl Reddit , Medium ) or any other channels used to promote your Perl content.
Looking forward to seeing your Hacktoberfest pull requests!
Spoiler Alert: This weekly challenge deadline is due in a few days from now (on July 23, 2023 at 23:59). This blog post offers some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.
Task 2: Zero Array
You are given an array of non-negative integers, @ints.
Write a script to return the minimum number of operations to make every element equal zero.
In each operation, you are required to pick a positive number less than or equal to the smallest element in the array, then subtract that from each positive element in the array.
I just release App::GUI::Harmonograph for your leisure and pleasure. In case your not not an English noble man form the 18th century who could afford an Harmonograph, even though modern DIY kits are quite affordable, it is a set of set of 3 independent pendula, which move a pen and and paper to create harmonious drawings, of sometimes extraordinary elegance and richness. I got the impulse and knowledge of the apparatus from this book and refer for more background details to this publication. However, the documentation (which is also displayed by the program itself) is much more of practical use, because the WxPerl version is greatly enhanced in possibilities, not in the least for dotted lines with variable density an additional rotation movement and flowing colors.
In Perl there is an expression
local
. It substitutes the specified value with undef until the end of the block. The values can be global hashes, arrays and scalars, as well as elements or slices of hashes and scalars.
The problem is that package hashes are not saved by local.
By package hashes I mean a hash with a colon at the end (%Package::) which stores the package symbols (GLOB).
Spoiler Alert: This weekly challenge deadline is due in a few days from now (on July 23, 2023 at 23:59). This blog post offers some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.
Task 1: Shuffle String
You are given a string and an array of indices of same length as string.
Write a script to return the string after re-arranging the indices in the correct order.
A program being executed, self terminating on encountering an non-viable condition is a typical scenario in Perl programs. The death sentence can deliver information about the departed application to the user as justification and demand appropriate resolution for the subsequent reincarnation.
Now I know my code fails more often than it succeeds, and it is for this reason I am planning an alternative wake for the programmed parting of my future terminal applications. As a once-in-a-run-time event, death might be more elaborately delivered, something to be celebrated. The last words of a dying application softens the developers ensuing grief, while encouraging resuscitation with an appropriately delivered injection of code.
Imagine my code being transformed from:-
do_something_risky() or die "you evil monster $!";
into
get_away_with_it() or deathSentence($!)
producing something like this on the terminal:-
I know such distraction wastes time, there are probably many more error trapping and diagnostic tools available. These may be absorbed over time...I am not really an expert. But I am collecting a series of reasonably uncontroversial, hopefully humorous "epitaphs"...
Interestingly (to me, at least) they reported that the removal of the /o modifier made their case 2-3 times slower. This surprised me somewhat, as I had understood that modern Perls (for some value of "modern") had done things to minimize the performance difference between the presence and absence of /o.
They indeed have.
Ironically, it’s qr objects which don’t get that benefit. On the machine I’m typing on, the following benchmark…
O wad some Power the giftie gie us
To see oursels as ithers see us!
It wad frae mony a blunder free us,
An' foolish notion: ...
My previous blog post, Match Anything, Quickly, brought a number of responses which are worth reading in their own right. The one that triggered this post, though, was from Nerdvana and Devin of Cincinnati Perl Mongers, who pointed out an error in my benchmark script. I had left off the intended /smx from the qr/ ... / version of the test, which meant that the regular expression did not in fact match.
Three cheers for code reviews!
The Cincinnati Perl Mongers came up with a further case which combines my two:
Spoiler Alert: This weekly challenge deadline is due in a few days from now (on July 16, 2023 at 23:59). This blog post offers some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.
Task 2: Left Right Sum Diff
You are given an array of integers, @ints.
Write a script to return left right sum diff array as shown below:
Programming in Perl is choices all the way down. Perl is a multi-paradigm programming language which means that Perl can support the development of software using different programming paradigms, e.g. functional programming, object-oriented programming, and more.
Programming languages are culture, and culture follows philosophy. Philosophy is how every culture provides itself with justification for its decisions, values, beliefs, and worldview.
Perl's philosophy
Perl's philosophy is TIMTOWTDI, i.e. “there’s more than one way to do it”. You might even say that Perl takes the position of not taking a position, and this disposition applies to the topic of a standard library as well.
To be clear, what some will call Perl's standard library is little more than a grab bag of functions, pragmas, and packages shipped together with the core. This collection is a mix of functional and object-oriented styles and is intentionally lightweight.
It’s probably worth mentioning that the Raku team has also adopted this posture (and tradition).
Following from my previous post, I am now actively encouraging everyone to switch licenses to MIT/ISC license or Apache 2.0.
My reasoning is that in the vast majority of cases the author and contributors want the software to be used by as many businesses and hobbyists as possible.
Previously I described how the burden of understanding and complying with licenses, including open source licenses, can be an unintended barrier to them using the software.
Perl modules tend to use "Perl 5" combination as the default license i.e. "Licensed under the same terms as Perl itself". And the "Perl 5" license is actually a dual licensing of the problematic Artistic 1.0 license and the dated GPL1.0 license which also has problems. Both are rarely used outside of Perl and in my view present a barrier to adoption.
Recall I described how permissive ("BSD") and copyleft ("GPL") licenses are functionally identical if no binary is distributed (websites) or for scripted languages that remain in source form.
Spoiler Alert: This weekly challenge deadline is due in a few days from now (on July 16, 2023 at 23:59). This blog post offers some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.
Task 1: Max Words
You are given a list of sentences, @list.
A sentence is a list of words that are separated by a single space with no leading or trailing spaces.
Write a script to find out the maximum number of words that appear in a single sentence.
Example 1
Input: @list = ("Perl and Raku belong to the same family.",
"I love Perl.",
"The Perl and Raku Conference.")
Output: 8
I introduce the progress of the new class feature of Perl. If you are interested in the progress of the new class feature of Perl, please see the following topics.
Hello ,
When "use DateTime;" library is included in perl file ,getting the error as
"CPM0 frl-plugin:perlscript: ERROR: 'times' trapped by operation mask at /usr/lib64/perl5/B.pm line 183."
Could someone provide some inputs on the same.
Also to which tag does this opcode 'times' belong to ?
example: fork,wait, waitpid will belong to :subprocess
Revision: that Cincinnati Perl Mongers found an error in the benchmark script used for this post. Match Anything Quickly - Revision 1 discusses their findings and links to a revised benchmark script. -- TRW 2022-09-02
Sometimes I want to filter a set of strings, but the details of the filter are not known beforehand. In particular, I may want a null filter, which simply accepts anything.
This looks like a job for a regular expression, but I can think of at least two implementations. One is to pass around regular expression objects. The second is to wrap a match (m//) in a subroutine reference, and pass that around. Given the use of regular expressions, there are a number of possibilities for a regular expression that matches any string.