Ratings and Reviews for CPAN


Rate a distribution

Find a distribution you would like to review:

Recent reviews (RSS feed)

MetaCPAN-API (0.50) *****

very good implementation, thanks

Daemon-Control (0.001006) *****

What a great module!! You can even control multiple daemons from the same script!

IPC-System-Simple (1.25) *****

Instead of repeating the error handling of system-calls over and over again in your code, just use this simple module. Thanks!

Pod-Markdown (2.002) *****

I'm using it for generating the README.md for GitHub, and I find the pod2markdown script perfect for the job. Haven't used any fancy POD option, but the results seem pretty convincing so far.

Capture-Tiny (0.28) *****

Great module, easy to install, easy to use - and it does what I am expecting. I am using it to capture the output of a system call (converting pdf-files with ghostscript).

Catalyst-Runtime (5.90085) *****

Very nice software design.

Path-Class (0.35) *****

I can't imagine trying to work with file systems without Path::Class. I often use the same scripts on both Windows and *nix machines, Path::Class keeps me from pulling (the rest of) my hair out. I find the documentation easy to understand, so it was quick for me to pick up and use with little trouble.

SOAP-WSDL (3.003) **

This project has a lot of work to be done.
Documentation is still difficult to follow.
The interface is somehow confusing.
It is not clear if the project is hosted on SourceForge or Github, so it is difficult to submit a issue.
Also, there are a lot of no answered issues in rt.cpan.org.
You definitely want to look for XML::Compile::SOAP for a Perl solution with you need to build/consume SOAP web services.

Digest-Crc32 (0.01) *

Apart from the issues raised by other reviewers, note that this module failes to set the :raw IO layer within filecrc2, so it generates the wrong CRC.

String::CRC32 and Digest::CRC are recommended and seem to work fine, although String::CRC32 is faster by a factor of 1.6 when passed a file handle.

cmpthese(-10, {
'Digest::CRC' => sub {
open my $fh, '<:raw', 'rld-ctos.r00';
my $digest = Digest::CRC->new(type => 'crc32');
my $crc = $digest->hexdigest;
'String::CRC32' => sub {
open my $fh, '<:raw', 'rld-ctos.r00';
my $crc = sprintf '%08x', String::CRC32::crc32($fh);

Rate Digest::CRC String::CRC32
Digest::CRC 37.6/s -- -39%
String::CRC32 61.4/s 63% --

SQL-Tokenizer (0.24) *****

Thanks for a module! It's save my day!!

use Modern::Perl;


WHERE RT.FRST_CCY_ID = 751 and RT.CCY_ID = CL.GRP_CL_ID and CL.CL_SCM_ID = 61 and RT.EFF_DT >= '01.08.2005' and (CL.END_DT = '31.12.9999' or CL.CL_ID =1004)";
my $sql2 = " SELECT AR.*








AR.AR_TP_ID <> 1467 AND



use SQL::Statement;
my $parser = SQL::Parser->new();
$parser->{RaiseError} = 1;
$parser->{PrintError} = 1;
my $stmt;

use Test::Warn;
use Test::More;
my $msg_err_or = q{Can't use OR in an ON clause!};
my $msg_err_ref = q{referenced but not found in FROM list};

for my $sql ($sql1, $sql2) {

my $ret = warnings_like {

eval {

$stmt = SQL::Statement->new($sql, $parser);

printf("( %s => %s ) \n",

, '', join(',', map { $_->name } $stmt->tables()));



[qr/$msg_err_or/i], "warnings: $msg_err_or";

if ($ret) { #change OR на END

$sql =~ s/OR/AND/xmg;

my $ret2 = warnings_like {

eval {

$stmt = SQL::Statement->new($sql, $parser);

printf("( %s => %s ) \n",

, '', join(',', map { $_->name } $stmt->tables()));



[qr/$msg_err_ref/i], "warnings: $msg_err_ref";

if ($ret2) {

use SQL::Tokenizer qw(tokenize_sql);

my $remove_white_tokens = 1;

my @tokens = SQL::Tokenizer->tokenize($sql, $remove_white_tokens);

my $paren_depth = 0;

my $cache = '';

my @tables = ();

for my $i (0 .. $#tokens) {

if (($tokens[$i] eq 'FROM') or ($tokens[$i] eq 'JOIN')) {

push @tables, $tokens[$i + 1];



say join ',', @tables;




Software-License-OrLaterPack (0.003)

For the record, I've implemented a similar feature for Debian by adding a summary and a "or_later" option to all GPL classes. See
anonscm.debian.org/cgit/pkg-perl/pack... and anonscm.debian.org/cgit/pkg-perl/pack...

Unfortunately, I did not think it could be useful outside of Debian, so I did not create a new distribution (or proposed a patch to RJBS).

Google-Checkout (1.1.1)

This was a really well-structured dist which made interfacing with Google Checkout very easy. However, following Google's decision to withdraw the Google Checkout service this module has become instantly obsolete.

It is a shame that all the hard work which went into it was useful for only a short time. For authors thinking about writing a similar dist for other payment providers this legacy code would provide a great example of one way to go about it.

Tie-Cache (0.21) *****

Very easy, very nice API to add a cache with a count limit. I looked around for other APIs but this package provides the best for my count limit cache requirement.

I use orisacache syntax like this

my $cache;

tie %$cache, 'Tie::Cache', {MaxCount => 100};

while ($something) {

my $value = $cache->{$key} ||= $obj->expensive_lookup($key);


I dinged the documentation as it does not show hash reference and orisacache examples.

I dinged Ease of Use as it was an absolute pain to build this package into an RPM with cpanspec and not have it pull in Tie::Cache::LRU as well.



Pod-POM-Web (1.20) *****

Over the years I have lived with various Pod browsers. They all had shortcomings (navigation confusing, navigation slow, too much index detail, too little, ugly CSS, no CSS, it just died on me, …).

So finally I'm delighted to have found Pod-POM-Web;- (a) it just worked out of the box, with none of the above problems (b) it has found me stuff I never knew I had, and taught me useful things.

Declaration of interest; I have no connection whatsoever with the author of Pod-POM-Web

Competence: I'm a lambda user

Text-CSV (1.33) *****

Thanks for such useful module, especially
allow_whitespace => 1,
whicj trim whitespace
also my example
source file
perl gen_csv.pl test.txt

Lingua-EN-Inflect (1.895)

Just add this review to link to Ben Bullock's Lingua::EN::PluralToSingular if you need to go the other way (converting English noun from plural to singular).

BTW, I don't like the interface either, and wonder why the Env module needs to be involved.

Lingua-EN-PluralToSingular (0.14) *****

Not perfect or exhaustive, but good enough and lightweight. With a dead-simple interface. Just the sort of libraries that are reusable almost everywhere. Thanks for this.

Also, this might not be immediately obvious since there's no mention on the See Also section: to go the other way (converting English noun from singular to plural) you can use Lingua::EN::Inflect.

YAPC-Russia (2.0.0) *****

Ваня, отличная идея, хороший модуль!

App-GitHub (1.0.1) *

Tried using --fork=... the app said fork successfully created, but in reality nothing was created

Tried using --create=... the app said creation failed, but in reality the repo was created.

Omitted --username and --password because I did not remember whether I had github credentials in .gitglobal... No errors on --fork=, says "no auth" on --create.

In summation, it looks like the module needs comprehensive testing and debugging in its logical pathways. And fixing to make it actually work.

Authen-Captcha (1.024) *****

works fine. Not required but recommend ;)

Text-Xslate (3.3.4) *****

In addition to it's overwhelming speed I'd like to point out that Text::Xslate throws largely useful error messages on screen in case something is wrong with the markup.

Secondly, the idea of cascading templates (similar to TDL - Djangos Template Language) and blocks than can be nested and overloaded really help to build a clean view in web apps: One specifies the outer tepmlate *WITHIN* the template itself, as opposed to Template Toolkit and others that want this as a redering parameter.

To sum it up: It's speedy, has great error messages and supports template inheritance.

Log-Declare (0.10)

I haven't used or evaluated this module in detail, but if there is one advantage to using procedural/command syntax:

info blah;

as opposed to object syntax:


then this module clearly demonstrates it. Using Devel::Declare (or the Perl 5.14+ keyword API), the former can be easily rewritten as something like:

info && blah;


if (CONST_LOG_INFO) { info blah }

and during compilation, Perl can optimize the line away and we get zero run-time penalty when logging (level) is disabled.

(Actually, it's also possible for the object syntax to get rewritten, e.g. using source filter, but it's more cumbersome).

Benchmark-Timer (0.7103)

Nice alternative module for benchmarking with a different interface than Benchmark (marking portion of code to be benchmarked with start and stop).

For most Perl programmers familiar to the core module Benchmark, I recommend looking at Benchmark::Dumb first though. It has an interface like Benchmark (cmpthese() et all) but with some statistical confidence.

Getargs-Long (1.1004)

Nice idea, but some performance concerns. If you want to use cgetargs (the compiled, faster version), you are restricted to the getargs() interface, which only features checking for required arguments and supplying default value. In which case you might as well use Params::Validate directly as it's several times (e.g. 3-4x) faster.

If you want to use the more featured xgetargs, there is currently no compiled version.

All in all, I think users should take a look at Params::Validate first.

Debug-Easy (0.20) **

Not as easy as the name might claim. First of all, why do users need to pass __LINE__ explicitly for every call??? Other logging modules will get this information automatically via caller().

Levels are a bit confusing: why is debug split to 2 (or 3)?

Not as flexible as it should be because the design conflates some things together. For example, most levels output to STDERR but some level (VERBOSE) outputs to STDOUT instead. The output concern and levels should've been separated. Another example would be the DEBUGWAIT level, where level is DEBUG *and* execution is halted (wait on a keypress) on log. What if users want a lower level setting *but* want execution to be halted on log? The halt/keypress setting should've been separated from the level.