Ratings and Reviews for CPAN


Rate a distribution

Find a distribution you would like to review:

Recent reviews (RSS feed)

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!

Data-Rx (0.200006) ****

Powerful data validation library, that can be used in several different languages (in theory, though the Perl implementation is the most complete.)

I've been using Data::Rx to parse inputs and validate outputs for the Open311 spec, and the process has been mostly great. I didn't want to just use an XML validation library, as the spec allows output in both XML and JSON format, so this really hit the spot. Most concepts are quite easy to model, though some complex schemas can't be modelled with the basic building blocks, and need to be written as plugins in Perl (which turns out to be easier than expected, and quite good fun.)

The documentation is a weak point, given how sophisticated this kind of recursive typechecking can be, but hopefully latest release's contributed docs/examples help a little with that.

Kelp (0.9012) *****

There's not much to say that hasn't already been said (ease of use, Plack integration). But I have been using Kelp for the past few weeks and enjoyed it so far. The fact you get a bare bones web framework with just the right amount of defaults is refreshing. If you need something else, it's easy to tack on with a module. If a module doesn't exist, it's very easy to write your own (I did in 25 lines of code) that added flash type functionality to my app.
Documentation is informative and nicely laid out. It's also available on the Kelp website with code highlighting.
Just remember the Kelp command line tool will not create the directory for you, only the structure. I fell for that one a couple of times and had to do a bit of cleaning up!

Getopt-Long (2.42) *****

Having worked for quite some time with option processing and several other similar modules, I have to say that most of the time you probably want to use Getopt::Long instead of the other alternatives. Or at least pick the alternatives which are based on Getopt::Long, instead of those that reinvent the wheel and do their own option parsing.

Most other modules that reinvent option parsing either don't bother to do short option bundling (-abc instead of -a -b -c), or abbreviation (--long-o instead --long-option-name), or the choice to (dis)allow mix-mashing options and arguments, or support '--' to end option processing, or respect ordering, or support multiple options (--verbose --verbose), or support '--foo=val' *as well as* '--foo val', and so on. These are features and conveniences that are taken for granted by people working daily in Unix command-line.

Test-Easy (1.09) *****

I use this every day!