A lot of your points I'll concede are probably better in Ruby. At least they're defaults in Ruby, while the solutions in Perl exist on CPAN (AnyEvent and POE for example for solutions similar to Fiber exit on CPAN but not in core).
However either you've totally missed the last four years in Perl. Perl has been challenged by Ruby, Python and Perl6. Because of this we've had a lot of developments that you gloss over or ignore.
> I can remember the Ruby syntax for defining a class. In Perl I had to look it up every time. Also Perl has two competing class systems.
The Perl Syntax for defining a class is pretty straight forward. I'm awfully sure I haven't had to look it up in a decade:
package Foo;
sub new { my $class = shift; bless {}, $class }
1;
I'm not sure what the "competing class" system you're referring to is though. Perhaps you mean Moose (first released in 2006 when you left). The assumption that it is "different" is incorrect because Moose does roughly the above, except the `new` method is inherited from a base class. The Moose syntax here is:
package Foo;
use Moose;
1;
Given the Moose syntax, I'm not sure what is harder to remember than Ruby's syntax:
class Foo
end
Additionally there is MooseX::Declare which hacks the Perl parser/tokenizer to allow new keyword syntax (a feature added to core 5.12) allowing you to say:
class Foo { }
> Good Perl practice involves boilerplate such as 'use strict'. I hear about lint tools and such and it makes me think the situation has gotten worse since 2006.
Yes it is unfortunate that Larry didn't predict what the good defaults would be in 1987 (Perl1) or 1994 (Perl5). With Perl 5.12 good Perl practice involves:
package Foo;
use 5.12;
I'm not sure that this is necessarily "worse" than 2006's:
package Foo;
use strict;
use warnings;
It is 2/3rds of the line count, but really we're talking about
one line. Additionally I'm a
very active member of the Perl community and I haven't heard about "lint tools". Perhaps you mean `perltidy`? This isn't a lint tool, it's a source code beautifier ... like html-tidy.
> Ruby IO operations throw exceptions when they fail. Hence you don't need the '|| or die "could not open!"' idiom.
You can use the (now in core) `autodie` pragma to eliminate this idiom from Perl too. Yes it's unfortunate that the idiom could spread for the first 20 something years of Perl making the nearly-anal-backwards-compatible defaults not enable it.
> The Ruby Array class and the Enumerable module are good. I've become dependent on methods that aren't as readily available in Perl: include? each_with_index all? any? permutation. Also the intersection and union operators: & and |
These exist on CPAN in various modules. List::Util, List::More::Util etc. Yes it is unfortunate that they're not more easily available. This is part of the price paid to backwards compatibility demons and keeping the Perl standard library (relatively) small.