Ratings and Reviews for CPAN


Rate a distribution

Find a distribution you would like to review:

Recent reviews (RSS feed)

Apache-ASP (2.62) *****


Selenium-Remote-Driver (0.2102) *****

Awesome WebDriver bindings module. I have used it for almost 4 years now.

XXX (0.27) *****

The part that makes this module convenient is that the functions return their original arguments. So when debugging (peppering dump statements), you don't have to change this:

return ["some", $expr];

to this (taking an example from another dumping module, Data::Dump):

my $tmp = ["some", $expr]; dd $tmp; return $tmp;

but just this:

return YYY ["some", $expr];

This should be imitated by the other dumper functions.

IO-All (0.78) ***

I like it, but I don't care for the operator overloading.

MCE (1.515) *****

I recently had a task that involved a 500G file. This fixed length file needed to be flipped or pivoted based on the content in certain fields. My first attempt at this was taking from 6 to 7 days, so I decided to give this module a try and got it down to a little over 2 days - amazing results! My only problem was understanding some of the documentation, which was probably because my programming orientation is more procedural than object oriented. But once I got some help from someone more knowledgeable, everything clicked into place. This is a great module!!

WebService-BaseClientRole (0.0004) *****

This module is simple, extendible, DRY, and well-documented. The reviewer "pagenyon" has no idea what he is talking about, it does support both JSON and XML. It's a no brainer to use this and cut down on re-implementing common requests and basic auth for most RESTful APIs. 5 stars for the quality of the module and easy of use.

Expect (1.29) *

New maintainer and of Expect i got problems :(
What happens?
Why new maintainer, why so many changes in 2014?

Getopt-Auto (1.9.7) ****

The POD parsing is now sensitive to dashes; it's nice to have the same functionality as the longer list specification.

Search-Elasticsearch (1.14) *****

Elasticsearch itself has a rich feature set and steep learning curve.
This module makes the rich feature set as easy to use as possible, and does what it can to help you with the steep learning curve.

See also Elastic::Model for a higher-level interface that builds on Search::Elasticsearch.

App-multiwhich (0.001)

Note that File::Which can also search for all matches too if you use it in a list context, e.g. @paths = which('foo'). File::Which also comes with a pwhich CLI utility which also accepts multiple arguments and has the -a switch to print all matches. The output format is slightly different than 'multiwhich' though.

In fact, the Unix 'which' command (or at least its Debian variant) also sports the -a switch.

HTML-HTML5-Entities (0.003) *

It doesn't even decode HTML5 entities. The author only tested a single character in his test cases, and that was for a plain HTML character. It's very likely he's never even used his own module or he would have noticed this glaring brokenness.

Ubic (1.57)


Object-Anon (0.001)

Nice idea. Some notes: 1) to be widely used, it really needs to be very efficient; 2) if the goal is simply to objectify a hash, perhaps Hash::Objectify or Object::From::Hash or Hash::To::Object (or Data::Objectify and so on) is a more descriptive name.

Data-Seek (0.03)

The "extremely fast and efficient" claim currently doesn't hold, as this module creates a *whole* flattened tree for *every* search operation.

A simple benchmark:

use Benchmark qw(timethese);
use Data::Seek;
use Data::DPath qw(dpath);
use JSON::Path;

my $data = { map { $_ => {map {$_=>[1..4]} 1..20} } "a".."z" };

timethese(-0.25, {

dseek => sub { $ds = Data::Seek->new(data=>$data); $ds->search("j.1.\@")->data },

dseek_cacheobj=>sub{ state $ds=Data::Seek->new(data=>$data); $ds->search("j.1.\@")->data },

dpath=>sub{ dpath("/j/1/*")->match($data) },

jpath=>sub{ JSON::Path->new(q[$.j.1.[*]])->values($data) },

Benchmark: running dpath, dseek, dseek_cacheobj, jpath for at least 0.25 CPU seconds...

dpath: 1 wallclock secs ( 0.27 usr + 0.00 sys = 0.27 CPU) @ 8292.59/s (n=2239)

(warning: too few iterations for a reliable count)

dseek: 1 wallclock secs ( 0.29 usr + 0.00 sys = 0.29 CPU) @ 37.93/s (n=11)

(warning: too few iterations for a reliable count)
dseek_cacheobj: 0 wallclock secs ( 0.33 usr + 0.00 sys = 0.33 CPU) @ 42.42/s (n=14)

(warning: too few iterations for a reliable count)

jpath: 0 wallclock secs ( 0.27 usr + 0.00 sys = 0.27 CPU) @ 11711.11/s (n=3162)

(warning: too few iterations for a reliable count)

Also: 1) the syntax is rather inconsistent: ':n' for array index access, but '.@' (instead of ':@') for grabbing all elements. 2) currently cannot select subtree (must always select leaf node).

As alternatives, I recommend the much simpler JSON::Path, or the more powerful Data::DPath.

Object-Anon (0.001) *****

The idea of the module is excellent.

Kelp (0.9012)

Great framework. Makes dependency injection dead simple.

Lingua-EN-AddressParse (1.20)

The review for version 1.19 is based on incorrect usage of the module.

Firstly, the 'new' method is called without supplying the argument to specify the country that the address format belongs to (the reviewer states "with country_code set to 'US', as specified", but this is not reflected in his code).

This argument is described at the very start of the module synopsis:
use Lingua::EN::AddressParse;

my %args =

country => 'Australia',

auto_clean => 1,


my $address = new Lingua::EN::AddressParse(%args);

However, I have also released a version 1.20 that gives a more helpful error message when the mandatory argument such as country is omitted.

The following output shows the reviewers sample data being correctly

my %args =

country => 'US',

auto_clean => 1,

force_case => 1,

force_post_code => 0,

abbreviate_subcountry => 0,

abbreviated_subcountry_only => 1

my $address = new Lingua::EN::AddressParse(%args);
my $address_input = "1 17th Street, Denver, CO USA";
my $error = $address->parse($address_input);

Original Input : 1 17th Street, Denver, CO USA
Cleaned Input : 1 17th Street Denver CO USA
Country address format : US
Address type : suburban
Non matching part :
Error : 0
Error descriptions :
Case all : 1 17th Street Denver CO USA
country : USA
post_box :
post_code :
pre_cursor :
property_identifier : 1
property_name :
road_box :
street : 17th
street_direction :
street_type : Street
sub_property_identifier :
subcountry : CO
suburb : Denver

Gzip-Faster (0.08) *****


Gzip::Faster is so much easier than most compression APIs, and 'just works' (tm). What's best is that this API does the thing that most people probably want, but is actually very tedious to figure out: Create and read gzip-compatible data. ...and it's fast.

We deal with "big data", and we have had to make lot's of our on proprietary file formats so compression is essential to what we do. I've been using almost every existing interface for creating and reading compressed data over the past 16 years.

This one, and the LWP library's (decode) are probably the two most simple and slick interfaces I've seen.

We'll still have to use lower-level APIs for a lot of things that we do, but I'm glad to have and use this.

Games-2048 (0.08) *****

My favorite 2048 implementation (it's text-mode, written in Perl, uses my module Color::ANSI::Util, and what else... oh yeah, it's the only implementation where I've reached 2048 :-) ).

One tip: enlarge the fonts of your terminal emulator (e.g. Ctrl-+ on Konsole) until it's big and convenient enough.

App-D (1.3.2)

As an alternative, one can also do:

alias d='

TZ=UTC date; # show date in UTC

date ; # show date in local timezone

cal -3 ; # show monthly calendar for curmon-1, curmon, curmon+1

Bhagavatgita (2.05)


Net-FullAuto (0.9999999999_001) *

Continuously spams CPAN update services like the IRC bots and RSS feeds with multiple null updates every day. All functionality is in one giant script. Rambling documentation full of SHOUTY ALL CAPS sections that conforms to no comprehensible format. Recommends installing itself as setuid.

Not to put too fine a point on it, but don't even consider touching this with a bargepole.

Math-Cartesian-Product (1.006) *

Because of rt.cpan.org/Public/Bug/Display.html?i...
(cannot be installed because of broken permissions) this distribution is extremely annoying to handle in non-trivial environments

Parallel-ForkManager (1.06) *****

Great module; I use it a lot for sysadmin scripts.

The only thing missing is a way to detect the number of logical cpu's in a system, but that's probably out of scope for this module.

JavaScript-V8 (0.07) *****

An excellent module.

I used JavaScript::SpiderMonkey before but ran into some limitations and decided to give JavaScript::V8 a try. It took me a while to get it to work on OS X, but it was well worth the effort. It was a big surprise for me how well this module integrates those two languages, almost as if they are one. The JS return-types are converted into proper Perl types and the other way around as well. You can even call JS methods easily from Perl, and the other way around. This made my code much simpler and I could remove large chunks of code that was handling the interaction between the two languages. Thanks a lot!