Reviews by Dan Dascalescu


Text-CSV_XS (0.90) ***

This module has many positive reviews, and it's the standard CSV parsing module, so I'll just add some caveats:

1. Make sure your CSV doesn't have duplicate column names. If it does, row data may move around from one column named X to the other column named the same.

2. It can't ->print hashrefs, so you'll have to convert them to array refs yourself:

my @array = map {$hashref->{$_}} @names;

$csv->print($file_out, \@array);

Parse-CSV (2.00) **

Significantly easier to use than Text::CSV.

Unfortunately, it doesn't handle Unicode files correctly (you get a "Failed to parse row" if your data contains characters over 0x7F). RT #32223 suggests this may be due to not passing the binary flag correctly to Text::CSV_XS.

Sadly, this module hasn't been updated since 2006.

2012 update: The module did receive an update in Feb 2012, but the Unicode problem above still hasn't been fixed.

Text-CSV-Slurp (0.9) ***

If you just want to read CSVs, this little module is great.

If you want to write them, beware that it will sort the columns, which you may or (more likely) may not want.

An option to (perhaps using Tie:IxHash or the like) preserve the original order of the fields would be great.

HTML-TableExtract (2.11) ****

Powerful - gives you access to HTML data inside table cells, unlike HTML::TableParser, but slightly more difficult to use than HTML::TableParser, and with fewer ways to select a table.

There is a comment from 2008 saying that the module didn't work on Cygwin or Windows - this is fortunately no longer the case, and the module works great.

HTML-TableParser (0.38) ****

Works well out of the box, extracting the text in table cells.

However, there's no way to extract additional HTML information from TD elements, for instance links or img src attributes. For that, use HTML::TableExtract.

HTML-TableContentParser (0.13)

Old module (2002). Has been failing tests for a while. Have a look at HTML::TableParser for a working alternative.

App-cpanminus (1.3000) *****

Way faster and more concise than cpan, and installs a bunch of modules on Strawberry Perl that just fail with cpan.

I wish cpanm did CPAN Testers reporting, but alas, that's outside its scope (cpan "minus").

DBM-Deep (2.0004) ****

This module was extremely easy to get started with, has very good documentation, and does transparent persistence (the disk file is automatically updated after you modify your data structure and before the program terminates), which other serialization-only modules (Storable, JSON, YAML) don't do.

While KiokuDB may be faster and safer for some applications, DBM::Deep is great when you want a lightweight persistence module for small datasets.

One star off because performance is mediocre: reading a hash of only 4,000 entries, each with two string key-value pairs, from a ~4Mb .db file, takes 6 seconds on a Core i3 CPU running at 2.5GHz.

Tie-File-AsHash (0.08) **

Trivial to use, does persistence automatically (transparently), but only handles single-level hashes.

$hash{foo}->{bar} = 'baz';

will silently not store anything in the tied file.

Good for simple use cases. If you need nested structures, check out DBM::Deep or KiokuDB.

Linux-Inotify (0.05)

Not a review, just a pointer to Linux::Inotify2, a module that supersedes this one.

PathTools (3.31) ***

Take a look at Path::Class, which is built on top of the venerable File::Spec and provides a much cleaner style of programming when dealing with file and directory manipulation, things like building directory paths out of individual component directories, making a relative directory (../../foo) absolute (/path/to/foo) and more.

XML-Parser (2.36) ***

There's nothing wrong with XML::Parser, other than its API being too arcane and complex for user code to call directly. The 3-star rating is to promote in CPAN search results alternatives which are build on top of XML::Parser and offer a better interface.

If you want a DOM-style interface, check out XML::LibXML. If you want a SAX interface, check out XML::SAX. If you want to make a big data structure from an XML document, use XML::Simple. Also take a look at XML::Twig.

ExtUtils-MakeMaker (6.54) *

Module author encourages the use of Module::Build instead of ExtUtils::MakeMaker. Matt S. Trout recommends Module::Install over Module::Build.

mst: failed Catalyst installation reports went down by over 50% when we switched from MB to Module::Install
mst: ergo I do not recommend Module::Build to anybody who wants end users to actually install their software

Rated 1 star to promote alternatives in CPAN search.

Acme-OneHundredNotOut (100) *

This is a document lauding the author's "Perl-sonal" accomplishments.

Talk-NothingIsFaster510 (0.02)

No rating. Since this is not a module per se, SlideShare may be a better host.

Religion-Islam-Quran (1.0)

[review deleted]

Net-Jabber (2.0) *

Superseded by Net::XMPP (see RT #52548). Rating 1 to give precedence to alternatives.

Net-SSLeay (1.35) *****

See for how to install this module on Windows. (1.30) *

This ( is a deprecated distro with a dumb name. Use the current distribution, Net-SSLeay.

(14:02:14) rafl: dandv: the dist name simply changed at some point, because what the original author used wasn't sane.

Time-Duration (1.06) *****

Very handy module when you want to display "X happened [...] ago" in a human-friendly way. That is, not "21 days, 7 hours, 34 minutes and 57 seconds ago", but just "21 days", while for very recent events you do get "3 minutes and 49 seconds ago".

Also works for future times and for absolute durations.

Book-Chinese-MasterPerlToday (0.01_09) *

People who program (need to) know enough English to understand programming documentation, code written by others, messages on forums and mailing lists, IRC channels, and a plethora of other sources that help with programming. The vast majority of software and documentation is written in English, and discussions around software are carried out mostly in English, like it or not.

To paraphrase the Chinese proverb, this module gives Chinese programmers a fish instead of letting them learn how to fish.

Catalyst-View-TT (0.29) *****

Hint: before working on someone else's project, check their View/ for PRE_CHOMP and POST_CHOMP options. These will radically change how Template::Toolkit treats whiltespace in templates.

That said, the TT view is great, but beware of TTSite:

castaway: iirc, ttsite sets up some stuff for you, which later gets in the way

zamolxes: i always prefer TT
zamolxes: cause I hate the boilerplate it generates
zamolxes: (ttsite)

rafl: use TTSite with care
rafl: it's not recommended
rafl: in fact, we just ported all the Cat::Manual docs from TTSite to plain TT
rafl: castaway: it's been causing a lot of trouble. mostly because of doing a lot of unecessary shit people don't actually need, and that gets in the way later on
rafl: i think it's cool for stealing ideas an concepts tho
rafl: castaway: heck.. you even said what exactly is wrong with TTSite already! :-)

HTML-Tree (3.23) ****

Easy to use module, even though the interface and documentation are somewhat unusual for today's day and age.

Since it builds an actual tree, the module is on the slow side (1000 lines or 256k of HTML from on a 2GHz CPU), so if you can remove any unneeded parts before parsing, that will help. For example, I was parsing a large HTML table and removing all the attributes of the TD elements, all formatting <spans> and all <NOBR>s around numbers, I was able to speed up the parsing 2x.

Also lacks XPath, but there is a separate HTML::TreeBuilder::XPath module.

Date-Pcalc (1.2) ***

A pure-Perl implementation of Date::Calc, but no longer updated since 2001.

Tripletail (0.47)

How the @#$% do I use this module?

KinoSearch (0.165)

No rating. Just mentioning that the Catalyst-based wiki MojoMojo uses KinoSearch for its search and searching a small wiki takes 100% CPU and 10+ seconds. Not saying that KinoSearch is bad; it may be that MojoMojo doesn't use it right, but I haven't looked into it yet.

DBIx-Class-TimeStamp (0.12) *****

I used to set default_value => \'current_timestamp' but that didn't work for MySQL, which wanted \'NOW()'.

DBIx-Class-TimeStamp offers a truly cross-database solution for timestamping the creation or update of records.

@Moritz Onken: All tests pass for me with v0.12.

Catalyst-Model-DBIC (0.16) *

Deprecated by the author. Rating 1 to promote alternatives in search.

DBIx-Class-HTML-FormFu (0.01005) *

Author deprecated module. Rating 1 to give precedence to alternatives.

HTML-FormFu (0.05001) ****

The documentation needs improvement, certainly, but FormFu itself is quite powerful. is a quick start guide.

Catalyst-Model-HTML-FormFu (1.00001) *

Author deprecated module. Rating 1 to give precedence to alternatives.

Task-BeLike-RJBS (20090219) *

RJBS rocks and I loved his talk on Git at YAPC10, but I have to agree with David Cantrell on this one.

Task-BeLike-BINGOS (1.04) *

Perhaps there is a better place for this than CPAN?

CPAN-SQLite (0.197) *****

I use a VPS with only 360MB of RAM, and this module brought down the RAM used to install a test module (Tie::IxHash) from 75MB to 21MB.

Moose-Tiny (0.04) *

Might be fun but it also wastes the time of those not part of the humorous elite.

base (2.12) *

use parent instead; to quote from its documentation: "[parent] was forked from base to remove the cruft that had accumulated in it."

Catalyst-Model-DBIC-Schema (0.23)

This review is for the Helper, which is very easy to use to introspect a database. With the "create=static" parameter, it outputs a Catalyst model file, then calls DBIx::Class::Schema::Loader and dumps the schema files. Combined with Catalyst::Plugin::AutoCRUD, this makes for an extremely easy way to browse through a database with a Catalyst application in less than a minute.

Catalyst-Plugin-AutoCRUD (0.44)

I've only used AutoCRUD so far on a toy database with one table, but it was as easy to use as it gets: just add "AutoCRUD" in the list of plugins that Catalyst should load, then surf to /autocrud.

Net-SMS-PChome (0.11) *

I talked to the module author and he has stopped supporting this module. He recommends using his SMS::Send::TW::PChome module instead.

Test (1.25) ***

Quick, tell what this does:

ok $d, 'valid diff';

If you answered "passes if $d evaluates to true, and sets the test name to 'a valid diff'", you're mistaken. The invocation will actually compare $d with the string 'valid diff'.

The problem is that ok() can be invoked with up to 3 parameters, and only the 3-parameter form allows you to specify a test name.

I prefer Test::Simple's (or Test::More's) interface, where it's clear that

ok $a, $b;

means that $a is the expression to evaluate and $b is the optional test name.

Net-SMS-Web (0.015) *

The idea itself is great (generic sending of text messages via free web sites), but unfortunately it hasn't picked up: no updates since 2003, nobody wrote drivers for other services than MTNSMS (now dead) and O2, and the mailing list has a grand total of 3 messages since 2003.

A modern alternative, for which there are drivers as of 2009, is SMS::Send by Adam Kennedy (of fame).

WWW-SMS (0.09) *

The module itself is a great idea, but unfortunately it hasn't picked up: no updates since 2003, nobody wrote drivers for other services, and all mailing list posts since 2006 are spam.

A more modern alternative, for which there are drivers as of 2009, is SMS::Send by Adam Kennedy (of fame).

SMS_API (4.01.1) ***

This module is specific to sending text messages via and should be named accordingly.

Net-SMS (2.64) *

This module is deceivingly named "Net::SMS". It actually works only with the Simplewire wireless text-messaging platform, and should be named accordingly.

Also, it was outdated even 2 years ago (see RT #24860).

Net-SMS-Mtnsms (0.003) *

No longer works - is 404.

No wonder, as this module hasn't been updated since 2002.

Bundle-Everything (0.041) *

Not just a silly distribution (who would want to download all of CPAN indiscriminately? It's over 15,000 modules), but a nefarious one, as it pollutes search results.

Together with the 2005 'Catalyst', this module should be removed from CPAN.

Catalyst (5.61) *

This is NOT the Catalyst you want. Search for Catalyst::Runtime.

Spreadsheet-WriteExcel (2.25) *****

20 minutes flat from never having used Spreadsheet::WriteExcel, to having converted a script that used to output a formatless CSV that Excel kept asking me how to parse.

The module has comprehensive documentation and examples, and was very easy to get running with. Within 20 minutes I could easily learn the gist, lookup specific information about and currency formatting, write the code and have it output exactly what I wanted.

CGI-Wiki (0.63) *

I only gave CGI-Wiki a 1-star rating to visibly lower the rating that it's listed with in the search results, so that users get a chance to see there's an alternative module instead.

This module hasn't been maintained for 2.5 years. If you're looking at a modern Perl-based wiki, you may want to consider the Catalyst-based wiki, MojoMojo.

Filter-Macro (0.11) *

I only gave Filter::Macro a 1-star rating to visibly lower the rating that it's listed with in the search results, so that users get a chance to see there's an alternative module instead.

The Perl Foundation recommends against using Filter::Macro at

Getopt-Clade (0.0.1) *

Not recommended by the module's author.

As to why 7 people have considered this comment unhelpful so far, it completely puzzles me. For Perl's sake, read the module documentation: "The module was supposed to be released by July 2005, to support the book "Perl Best Practices". Unfortunately, due to a series of family medical crises, the release of the module has been delayed [...]"

Attribute-Types (0.10) *

I only gave Attribute::Types a 1-star rating to visibly lower the rating that it's listed with in the search results, so that users get a chance to see there's an alternative module instead.

This module is old and no longer maintained. Use Moose instead.

Contextual-Return (v0.2.1) *

I only gave Contextual::Return a 1-star rating to visibly lower the rating that it's listed with in the search results, so that users get a chance to see there's an alternative module instead. recommends to avoid if possible: "Context is complicated enough without abusing it even more. There are probably cases where this module is handy, but think twice before using it, as it will only complicate your API and code."

Log-StdLog (v0.0.3) *

I only gave Log::StdLog a 1-star rating to visibly lower the rating it's listed with in the search results, so that users get a chance to see there's an alternative module instead. recommends:

"Use Log::Dispatch or Log4Perl instead."

Sub-Installer (v0.0.3) *

I only gave Sub::Installer a 1-star rating to visibly lower the rating it's listed with in the search results, so that users get a chance to see there's an alternative module instead. recommends:

"Use Sub::Install (note the missing -er) or for more complex installation, Sub::Exporter."

YAML (0.68) *

I only gave YAML a 1-star rating to visibly lower the rating that it's listed with in the search results, so that users get a chance to see there's an alternative module instead.

Catalyst has switched from YAML to Config::General. Also, recommends against using YAML:

"If you just need to dump and load YAML, use YAML::XS which is faster, less buggy and implements YAML 1.1. Though JSON, i.e. JSON::XS, Config::General may be preferable as a simple serialization format."

CGI-pWiki (0.15) *

With only one release, no test suite, and no updates since 2002, I would never consider CGI::pWiki seriously.

DISCLAIMER: I haven't used this module and I'm a developer of another Perl wiki (MojoMojo).

Tie-IxHash (1.21) *****

I use this module often enough that I think it should be bundled with Perl.

Tie-InsertOrderHash (0.01) **

I haven't used this module. How is it different from Tie::IxHash? The documentation should mention that as prior art.

XHTML-MediaWiki (0.05) **

This module's documentation consists only of a Description, which is stolen verbatim from Text::MediawikiFormat.

HTML-WikiConverter-Markdown (0.05) *****

I used this module to convert from Textile to Markdown. There were a few glitches with code sections, which I reported to the author via RT. He promptly fixed all of them and released a new version of the module.

Very easy-to-use module, with great support.

Acme-Blarghy-McBlarghBlargh (0.001-03-09-2009) *

Hopefully we'll see some spectacular developments here. Right now all this module does is declare a $VERSION variable.

CPAN should have a sandbox for folks to upload test modules.

HTML-Shakan (0.01_02)

From the example, this module seems very similar to HTML::FormFu in various ways. How is it different, though? What is the rationale? Why "yet another form generator"? Aren't there enough already? The documentation does not answer any of these questions.

I've only rated the documentation as 3/5 and left the other fields undef. Will be happy to update the review once more information becomes available.

Catalyst-Plugin-Session-FastMmap (0.12)

Obsoleted by Catalyst::Plugin::Session::Store::FastMmap.

Catalyst-Engine-HTTP-POE (0.08) *

Just rating this as deprecated in favor of Catalyst::Engine::HTTP::Prefork .

Data-Uniqid (0.11) **

A simple module for basic GUID/UUID needs, which also comes with a handy base62 output, but not updated in a long while.

If you need some serious UUID foo, check out the documentation of Data::UUID and use Data::GUID (which RJBS plans to replace UUID with).

Data-Hexdumper (2.0) *****

A more powerful module than Data::HexDump, with various options to control output. And, as of today's version, as easy to use as Data::HexDump:

print hexdump($data);

In the previous version, you had to write "hexdump(data => $data, [param1 => value1, ...])". I contacted the author requesting that the parameters hash be made optional, and he implemented this feature the next day, together with support for 64-bit data.

Excellent functionality, documentation, and support.

Text-Autoformat (v1.14.0) ***

This module seems extremely powerful, but it has no tests ( and a bug queue of 23 items, some dating from 6 years ago.

Convert-Wiki (0.05) **

I'm evaluating wiki parsers to use with MojoMojo (the Catalyst-based wiki). Convert::Wiki claims in its example and documentation to have a from_html function, but there is no such function in the source and the author replies in RT #32909 that indeed, there is no from_html. WTF?

The documentation also doesn't mention what the "various wiki formats" are, doesn't give any example of such format, and the source code is very thin. Probably an abandoned work in progress.

Text-Diff (0.35) ****

Does a nice job at diff-ing multiline strings side-by-side, except on long lines, which wrap around the screen and mess up the output. An option to hard wrap long lines would have been great.

Class-Std-Utils (v0.0.3) *

Damian Conway advises against using Class::Std and Class::Std::Utils - details at Use Moose instead.

Class-Std (0.0.9) *

Damian Conway himself advises against using Class::STD (details at Use Moose.

Date-Manip (5.54) *

The author of Date::Manip advises to use it only if you have a specific need that other modules can't handle. Other users pointed out problems with Date::Manip at

Tangram (2.10) *

I haven't used Tanagram so take my review with a huge grain of salt. Instead, I use KiokuDB, which is based on Moose and doesn't require a schema to be defined. It's still in its infancy, but rapidly developing and looks very promising.

Plucene (1.25) *

I haven't used Plucene, so take my review with a huge grain of salt, but the Catalyst-based wiki MojoMojo switched from Plucene to KinoSearch.

Pixie (2.08_02) *

This module is very old and unmaintained. Consider KiokuDB instead.

Data-Dumper (2.121) *

This module is very old and its output is ugly ('$VAR1' anyone?).

I switched to Data::Dump and haven't looked back.

Data-Dump (1.14) *****


use Data::Dump 'dd';
dd $my_complex_data_structure;

No more $VAR1 ugliness from old-timer Data::Dumper.

Catalyst-View-TT-ForceUTF8 (0.13) *

The Catalyst wiki recommends against using ForceUTF8. Details at

Kwiki (0.39) *

Kwiki is no longer maintained. The emerging Perl wiki of choice seems to be MojoMojo, which is powered by Catalyst.

HTML-AA (0.10) *


Test-Differences (0.4801) *****

The only reason I used Test instead of Test::More was the automatic diff on multiline strings that Test did. Yet, Test::Differences provides that feature in a much better format: the differences are shown side-by-side, which is easier to see compared to the list of "-/+" pairs displayed by Test.

I haven't used other methods than eq_or_diff, but that one was extremely straightforward and easy to use.

Text-Pluralize (1.1) *

Simple, but doesn't handle a lot of peculiarities of English (sheep, child/children etc.).

Use Lingua::EN::Inflect instead.

HTML-GenToc (3.00) ***

* detects headings with the same name and won't generate conflicting links

* the anchor name generation algorithm takes as little as possible from the heading to make a name. "On installing Perl" will become just <a name="on">. This is bad usability and SEO.
* even if you use the to_string => 1 option, there's still output to STDOUT. In the context of a web application, this ruins things badly (I was trying to use HTML::GenToc to add a TOC plugin to the MojoMojo wiki).

HTML-XSSLint (0.01) *

This library is a nice idea, but it hasn't bee updated since 2002! For a list of up-to-date XSS attacks, see

Catalyst-Plugin-Crypt-CBC (0.01) *****

A simple, neat plugin that does the job.

OO-DateTime (0.01) *

This module has not been maintained since 2000. Use DateTime instead.

Text-CSV-Simple (1.00) ****

This module depends on Text::CSV_XS, and provides a way to specify options for the CSV parser. One such option would be "binary => 1", which is necessary if you want to parse UTF-8 data.

Class-CSV (1.03) **

This module depends on Text::CSV_XS, but doesn't provide a way to specify options for the CSV parser. One such option would be "binary => 1", which is necessary if you want to parse UTF-8 data.

Witch Class::CSV, parsing CSV files containing non-ASCII characters is impossible.

Catalyst-Example-InstantCRUD (v0.0.18) ***

Installation requires a huge bunch of modules. Spent more than hour getting everything installed on a FreeBSD 4 box.

InstantCRUD claims that "the generated application shall not work for tables with composite primary keys (other than the link tables for a many to many relatioship)". I found it not to work for two tables, one referencing another through an ID foreign key.

For independent tables, it works. Not much to comment, perhaps except that the paging system could use some improvement. If you have a huge table, ALL page numbers will fill your screen. BTW, I'd rather use a "Records M - N" approach than page numbers.

DBD-PgPP (0.05) *

SELECT * WHERE parameter = ?

won't find anything if the string bound to the '?' placeholder ends in a '?' sign. Unacceptable. Use

Hoping that helps you not waste a few hours debugging,
Vlad Dan Dascalescu

RTF-Parser (1.09) *

I've only used RTF::TEXT::Converter attempting to convert a Greek RTF to text and it simply does not do the job. Worse, it doesn't even handle Unicode characters (\uN), which do not pose any language detection or encoding problems.

RTF-Reader (0.01_1) **

I've only used RTF::Reader::Interface::asText. Very simple to use but buggy (didn't decode escaped '{'s (\{)). Also, doesn't provide any way to output to UTF-8 according to the language specified in the RTF.

File-NCopy (0.34) ****

Does the job, but the documentation needs improvement. There is no explicit "Syntax", for example. Also, copying one directory to another, for example wanting "/src1/src2/" to have a copy as "/dest1/dest2/" will create src2 in /dest1/dest2. Which might be OK, but the user should be instructed to use copy("/src1/src2/*", "/dest1/dest2/") if they want all the contents of src2 to be copied into /dest1/dest2/.

PS: If using ActivePerl 5.8.4, watch out for PPM installing version 0.32 of this module, which has some serious bugs regarding directiory separators. These bugs have been fixed in 0.34.

Win32-Autoglob (1.01) ****

The documentation doesn't mention anything about filenames containing spaces and the implementation doesn't need to escape the '*' and '?' because they are in a character class.

After all, a good module.