As Perl has almost all "esoteric" parts from the other lists, I'll tell you the one thing that Perl can't:
The one thing Perl can't do is have bare arbitrary URLs in your code, because the //
operator is used for regular expressions.
Just in case it wasn't obvious to you what features Perl offers, here's a selective list of the maybe not totally obvious entries:
Duff's Device - in Perl
Portability and Standardness - There are likely more computers with Perl than with a C compiler
A file/path manipulation class - File::Find works on even more operating systems than .Net does
Quotes for whitespace delimited lists and strings - Perl allows you to choose almost arbitrary quotes for your list and string delimiters
Aliasable namespaces - Perl has these through glob assignments:
*My::Namespace:: = \%Your::Namespace
Static initializers - Perl can run code in almost every phase of compilation and object instantiation, from BEGIN
(code parse) to CHECK
(after code parse) to import
(at module import) to new
(object instantiation) to DESTROY
(object destruction) to END
(program exit)
Functions are First Class citizens - just like in Perl
Block scope and closure - Perl has both
Calling methods and accessors indirectly through a variable - Perl does that too:
my $method = 'foo';
my $obj = My::Class->new();
$obj->$method( 'baz' ); # calls $obj->foo( 'baz' )
Defining methods through code - Perl allows that too:
*foo = sub { print "Hello world" };
Pervasive online documentation - Perl documentation is online and likely on your system too
Magic methods that get called whenever you call a "nonexisting" function - Perl implements that in the AUTOLOAD function
Symbolic references - you are well advised to stay away from these. They will eat your children. But of course, Perl allows you to offer your children to blood-thirsty demons.
One line value swapping - Perl allows list assignment
Ability to replace even core functions with your own functionality
use subs 'unlink';
sub unlink { print 'No.' }
or
BEGIN{
*CORE::GLOBAL::unlink = sub {print 'no'}
};
unlink($_) for @ARGV