Reviews by Mingyi Liu


Statistics-Lite (3.1) ***

This module's Variance and Standard Deviation calculations are using N as denominator instead of N - 1.

This issued only affected version 3.0. The documented workaround in that version does not work. For now, I've switched to using Statistics::Descriptive instead.

Update: I sent author an updated version that fixed this problem and author improved it and released 3.1.

CGI-Ajax (0.641) ****

This is a nice module with (almost) adequate documentation. However, its usage was hampered by some hidden bugs (as of V0.6) and slight interface deficiencies.

The main advantage the module provides is to encapsulate the routine AJAX code into easy-to-use functions such that you only have to worry about your script's own logic (and not AJAX details), what input your script needs and where (which html elements) on the web page to place the output. The packaged example scripts are in some cases much better than the documentation, which has some errors (like the first script in the synopsis wouldn't even produce anything 'cause it missed the 'print' in 'print $pjx->build_html( $cgi, \&Show_HTML);').

Another good thing I found out was that one could easily make the script deal with both AJAX request and traditional POST/GET requests. It came in handy for one of my web apps (since it needs to stream an Excel file in some situations).

Now the bad part: V0.6 has a hidden bug that took me longer to debug than I could've worked out an AJAX web app myself as AJAX is easy in itself. I emailed the authors of the bug (and its cousins) and hopefully it'd be soon patched. (Edit: author fixed the bug in V0.64)

Another thing is that the module does not deal with multiple select well at all. In fact, all selections are flattened into 1D array such that if you have multiple html elements, you don't know where the first selection starts (or the last ends) in the array you got in your perl_func. But it's also easily patchable and I emailed an suggestion to author. (Edit: fixed in V0.641)

All in all, this is a nice module that'll save your time when you build AJAX app many times. If it fixes its current issues, it'd be great.

DBD-Pg (1.40) ***

Note that this review is specific to V1.40. Overall DBD-Pg is pretty good, but V1.40 has some bugs or compatibility problem. I tried to use it for Postgres 8.0.0beta3 and Perl 5.8.6, 'make test' failed with message: DBD-Pg-1.40/blib/arch/auto/DBD/Pg/ undefined symbol: PQprepare at /5.8.6/i686-linux/ line 230.

However, DBD-Pg-1.22 has no such problem on either Perl 5.6.1 or Perl 5.8.6. So I had to revert back to this older version.

Parse-Yapp (1.05) ****

The documentation of this module can definitely be improved. Even bison documenation would not be of help in some situations (after all, bison is in C). Once user found out how to use it, it is clear that this module is easy to use (still not nearly as easy as Parse::RecDescent since you'd have to provide a lexer function, or tokenizer), powerful, compatible with other YACC-based parser generators. But the most conspicuous advantage of this module is its parser's speed. Much much faster than Parse::RecDescent when dealing with long input.

However, in the end, based ONLY on my experience, I would not recommend using this module in most situations. That is because for situations where performance is no issue, Parse::RecDescent should be used. When performance is needed, Perl-byacc should be used. The only situation where Parse::Yapp should be used is on the OSes where perl-byacc is not available like Windows.

Note that one criticism against perl-byacc is that its parser is not OO, but one could fake a OO parser simply by adding a global variable $self (or use patches for older version 1.8 or newer version 2.0). In my experience, perl-byacc parser was twice as fast as one based on Parse::Yapp when using the same grammar and essentially the same lexer.

I made a detailed comparison, usage example of Parse::RecDescent, Parse::Yapp, and Perl-byacc during my Entrez Gene parser project at

Parse-RecDescent (1.94) ****

Easy to use, very flexible, very powerful, well-documented and venerable, Parse::RecDescent is a very good module for parsing any text that could be described by a grammar. Compared to Parse::Yapp, Perl-byacc, this one definitely wins hands down in all those aspects. The only caveat is the speed of the module when dealing with long input strings - its processing increases polynomially to string length (nearly O(n3) in benchmark). I made a detailed comparison, usage example of Parse::RecDescent, Parse::Yapp, and Perl-byacc during my Entrez Gene parser project at

This module is best for novice users, complex (context-sensitive or dynamic) grammars, or any situation where input is short or performance is no issue.

Math-Cephes (0.42) *****

I was trying to use perl to calculate very significant P-values in Poisson and Chi-square, and this one is the only module I found on cpan (or internet) that worked in those situations very well. Highly recommend this module for those common statistical distributions! BTW, the module seems to do a whole lot more in math too, although I did not use other functions.