NAME
perleasyfail - A collection of cases where core Perl fails its "easy things should be easy" mantra (plus their remedies)
VERSION
This document describes version 0.000002 of perleasyfail (from Perl distribution perleasyfail), released on 2021-06-10.
DESCRIPTION
NOTE: This is an early release. Comments and suggestions highly appreciated, particularly in these areas: 1) adding more cases; 2) adding Raku solutions; 3) adding more discussion for each case.
This document lists tasks which might be simple to do in other programming languages or tools, but more verbose or complicated in Perl. To be fair, no tools are perfect. While Perl has the motto "easy things should be easy, and hard things possible" [1] the creator had a set of cases to optimize and not other cases. The latter cases are the focus of this document.
[1] Wall, L., Christiansen T., Schwartz, R., "Programming Perl", 2e, 1996.
ARY (Arrays)
ARY/IDENTIFY/1 (Check if something is an array)
JavaScript:
foo instanceof Array
Array.isArray(foo)
PHP:
is_array($foo)
Python:
type(foo) is list
isinstance(foo, list)
Ruby:
foo.kind_of? Array
Perl:
ref($foo) eq 'ARRAY'
The Perl version is not so bad brevity-wise, but: 1) a typo when typing 'ARRAY'
will not be caught in compile-time; 2) it's slower (though in most cases it won't matter); 3) it fails to recognize blessed array or tied array.
Perl alternative #1:
use Scalar::Util qw(reftype);
reftype($foo) eq 'ARRAY'
This can handle blessed array.
Perl alternative #2 (uses Ref::Util):
use Ref::Util qw(is_arrayref);
is_arrayref($foo);
This can handle blessed array.
ARY/FINDELEM/1 (Check whether an item is in an array)
JavaScript:
ary.includes(value)
PHP:
in_array($value, $ary)
in_array($value, $ary, $strict) # also check types, so 123 will not match "123"
Python:
element in list
Ruby:
ary.include? value
Perl:
grep { $_ eq 'value' } @ary # for string comparison
grep { $_ == value } @ary # for numeric comparison
This is one of the cases where strongly-typed languages have an advantage because the user does not need to explicitly specify the operator to use. Perl has multiple equality operators and the user needs to specify which one she wants because the scalar can both be a number of a string.
True, the Perl's grep
version is more flexible, but we're talking about easy things here. Plus there's another problem with grep
: it does not short-circuit. If you have a million-element array and the value you want is found in the first element, Perl will still continue to the end of the array.
Alternative #1 (uses List::Util):
use List::Util qw(first);
first { $_ eq 'value' } @ary
This solution solves the non-short-circuiting problem, but does not provide syntax brevity.
Alternative #2 (uses List::Util::Find):
use List::Util::Find qw(hasnum hasstr);
hasnum $num, @ary;
hasstr $str, @ary;
HASH (Hashes)
HASH/IDENTIFY/1 (Check if something is a hash)
PHP:
is_array($foo) # in PHP, hash (associative array) is still an array
Python:
type(foo) is dict
isinstance(foo, dict)
Ruby:
foo.kind_of? Hash
Perl:
ref($foo) eq 'HASH'
The Perl version is not so bad brevity-wise, but: 1) a typo when typing 'HASH'
will not be caught in compile-time; 2) it's slower; 3) it fails to recognize blessed hash or tied hash.
Alternative #1 (uses Scalar::Util):
use Scalar::Util qw(reftype);
reftype($foo) eq 'HASH'
This can handle blessed hash.
Alternative #2 (uses Ref::Util):
use Ref::Util qw(is_hashref);
is_hashref($foo);
This can handle blessed hash.
HOMEPAGE
Please visit the project's homepage at https://metacpan.org/release/perleasyfail.
SOURCE
Source repository is at https://github.com/perlancar/perl-perleasyfail.
BUGS
Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=perleasyfail
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
AUTHOR
perlancar <perlancar@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2021 by perlancar@cpan.org.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.