Reviews by Steven Haryanto

cpanratings
 

RSS

Clone-PP (1.05) *****

Thanks for providing a pure-Perl alternative for deep cloning. Otherwise we are stuck with core module Storable's dclone, which cannot handle Regexp objects out of the box, must use deparse to handle coderefs, and not to mention is not as fast as it should be because it's a marshall+unmarshall algrorithm (ab)used for deep cloning.

Of course, there are faster XS-based cloning modules on CPAN (all currently non-core, believe it or not there are no core modules for cloning except Storable). I'd recommend Data::Clone. But it's nice to have a pure-Perl implementation, e.g. for creating a dependency-free script using App::FatPacker.

Steven Haryanto - 2014-04-09T08:27:21 (permalink)

Was this review helpful to you?  Yes No

IPC-System-Simple (1.25)

This is a well-designed module with a good interface. The core system()'s behavior of whether to invoke shell or not depending on the number of arguments is ... unfortunate. This module fixes that.

However, the previous review's comparing of IPC::System::Simple with IPC::Run or IPC::Simple is rather misguided. They focus on different things: IPC::System::Simple focuses on providing shell/no-shell versions of invoking commands and making a command's result easier to parse. It does not support feeding text to STDIN, handlers for STDOUT/STDERR, timeouts, or the other features that IPC::{Run,Cmd} support.

Steven Haryanto - 2014-03-18T03:41:17 (permalink)

Was this review helpful to you?  Yes No

IPC-Cmd (0.92)

IPC::Cmd does its job, but the interface is inconsistent, probably because a different author wrote run_forked() (and didn't follow the same convention). run() accepts a hash of arguments, but run_forked() accepts a scalar + hashref. run() returns a list, but run_forked() returns a hashref. Command in run_forked() cannot be an arrayref, but in run() it can be.

Steven Haryanto - 2014-03-18T03:35:06 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Umask-Local (1.0)

Please consider a simpler non-OO interface instead, a la File::chdir:

use File::Umask; # or whatever, the "Local" thing is redundant
{

local $UMASK = 0077;

open(...);

copy(...);
}
# previous umask is restored

which is arguably better (to me at least) than the current:

use Umask::Local;
{

my $umask_local = Umask::Local->new(0077);

open(...);

copy(...);
}
# previous umask is restored

Steven Haryanto - 2014-03-13T07:08:31 (permalink)

Was this review helpful to you?  Yes No

Proc-PidUtil (0.08)

No file locking is currently done to the PID file to avoid race condition. Look at Proc::PID::File for a more proper implementation.

Steven Haryanto - 2014-01-27T16:09:11 (permalink)

Was this review helpful to you?  Yes No

Data-Dumper-Sorted (1.12)

Unnecessary. Data::Dumper does have the option to sort hash keys ($Sortkeys, look for 'sort' in 'perldoc Data::Dumper').

This module also does not handle circular refs yet (and probably lacks other features of Data::Dumper too).

Also the choice of returning error ("$Var00 = not a reference" when given Dumper(1) for example) as result is arguably unwise.

Steven Haryanto - 2014-01-27T16:04:59 (permalink)

Was this review helpful to you?  Yes No

Archive-Probe (0.85)

I would personally pick a non-OO, no-nonsense interface based on File::Find, like:

use File::Find::Archive qw(find); # or find_archive
find(sub { ... }, "some.tar.gz");

instead of the multiline, tedious setup just to search a file.

Steven Haryanto - 2014-01-24T12:23:49 (permalink)

Was this review helpful to you?  Yes No

App-DBBrowser (0.011)

A nice, minimalistic, terminal-based user interface for browsing your database and tables. Might be useful for simple cases.

It would be *much* more useful if usernames/passwords, queries, and other settings can be saved in a config/session file.

Steven Haryanto - 2014-01-24T12:06:54 (permalink)

Was this review helpful to you?  Yes No

Locale-Maketext (1.23)

Users might want to check out this article on why one should perhaps use Locale::TextDomain instead of Locale::Maketext: www.perladvent.org/2013/2013-12-09.html

Steven Haryanto - 2014-01-24T11:39:46 (permalink)

Was this review helpful to you?  Yes No

Curses-Toolkit (0.211)

Nice effort, but one might also want to look at Tickit, which is not curses-based and looks more promising. Being based on Curses, this module still suffers from the many bugs and limitations of curses. The lack of Shift-Tab support, for one.

See also: www.perlmonks.org/?node_id=1059926

As I explore doing TUI more, I will update the reviews.

Steven Haryanto - 2014-01-24T11:30:24 (permalink)

Was this review helpful to you?  Yes No

Moo-Lax (0.10) *****

Great idea! I've been bitten and annoyed by strictures on more than one occasion. It has its uses, but users should have a choice on how to react to warnings.

Steven Haryanto - 2014-01-24T11:09:10 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

App-YTDL (0.004)

This module is based on WWW::YouTube::Download but its documentation does not yet explain how it differs from WWW::YouTube::Download. From what I see at a glance, App::YTDL supports downloading a video from a playlist and setting download speed limit, but perhaps the author should do the mode detailed explaining to help users when to choose between the two.

Steven Haryanto - 2014-01-24T11:04:16 (permalink)

Was this review helpful to you?  Yes No

Data-CompactDump (0.04)

At the current form, simply too simplistic to be an alternative to Data::Dump or Data::Dumper. No support for blessed refs, filehandle/globs, circular references, and so on. Changes numbers to stringy numbers or vice versa.

Currently also contains some bugs like for -1 (changes it to string), "\\" (produces invalid dump, does not handle backslash yet currently),

And Data::Dump's dump of {} and [] are currently more compact ;-)

Need to be improved significantly first. But keep up the effort.

Steven Haryanto - 2014-01-24T10:41:57 (permalink)

Was this review helpful to you?  Yes No

P (1.1.24)

I personally don't mind the namespace choice. There are other single-letter CPAN modules too like B, L, U, V. If you have a beef with regard to namespace, don't single out P and perhaps downvote the other modules too.

Having said that, I would like to comment on the design and implementation of this module.

1) The choice of Unicode character U+2204 as representation of undef. Unless one does something like 'binmode STDOUT, ":utf8"', with 'say P undef' I am just trading one warning ("Use of uninitialized value") with another ("Wide character in say/print"). The wide character warning is avoided if you do 'P "%s", undef' though, which means...

2) P loads utf8 by default. For ultra-lightweight cases, this is sometimes not desirable. There is currently no way to turn this off.

3) The arbitrary choice of three levels deep when printing references. This can be customized but with an unusual syntax. But again, the arbitrary choice of three.

4) The "complex" rules of newline printing. p() is like puts, it can optionally add a newline. But unlike puts, the doc says it can also remove newlines. The behavior can also change if the string to be printed ends with 0x83.

I might use P for a sprintf/printf replacement, but for debugging values, I'd prefer something "dumber" like Data::Dump::Color (or Data::Printer, if that's your thing).

Steven Haryanto - 2014-01-14T11:05:37 (permalink)

4 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Xporter (0.0.11)

A couple of comments. First, if you want to import the default exports *as well as* some additional others, you can use Exporter's feature (the :DEFAULT tag):

use SomeModule qw(:DEFAULT a b c);

or you can also "use" twice:

use SomeModule; # imports default exports

use SomeModule qw(a b c); # import a, b, c

Second, if you use Xporter, your module will behave unlike most CPAN modules out there, because a majority of modules use Exporter. When people see this Perl code:

use SomeModule qw(a b c);

normally they will expect only a, b, and c are exported. If SomeModule uses Xporter, it will also by default export the default exports.

Basically Xporter is just Exporter with a different default (not arguably better or more user-friendly). For the sake of minimizing surprise to my users, I would avoid the use of Xporter.

UPDATE 2014-01-24: some edits. I appreciate the effort of the author to defend her module, though I am not convinced by her arguments.

Steven Haryanto - 2014-01-14T10:37:29 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Dist-Zilla-Shell (0.005) *****

Nice tool that lets you type dzil commands like 'build', 'test', etc while sending all the other unknown commands like 'ls -l', 'man Foo' to the underlying shell. Also lets you avoid multiple startup overhead of dzil :-)

Steven Haryanto - 2013-11-12T20:03:32 (permalink)

Was this review helpful to you?  Yes No

CPANPLUS-Shell-Curses (0.07) *

Unmaintained. Installs but no longer runs.

Steven Haryanto - 2013-10-27T04:44:23 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Task-Mechanistic (0.02)

If you peek into its Makefile.PL, you'll see a seemingly random/heterogenous collection of modules to install (instead of just WWW::Mechanize). This is probably a Task::BeLike::$AUTHOR in disguise.

Steven Haryanto - 2013-10-26T12:29:51 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Sereal (0.370) *****

So far the best of the bunch.

FAST: much faster than Storable, roughly the same speed as (sometimes slightly faster than) Data::Clone for cloning.

FEATUREFUL: Can handle circular references, Regexp objects (trips out-of-the-box Storable), JSON::{PP,XS}::Boolean objects (trips Data::Clone).

COMPACT: definitely more compact (up to several times) than Storable.

I'm sold. What more do you want? Le Storable est mort, vive le Sereal!

Steven Haryanto - 2013-10-17T09:42:36 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Test-Tester (0.109) *****

If you write test functions, you need this. It's like the "Test::More" for "Test::More". However, it currently does not work out of the box with subtests (submitted as wishlist to RT).

PS: Thanks to Toby Inkster for pointing this module out.

Steven Haryanto - 2013-09-26T23:41:32 (permalink)

Was this review helpful to you?  Yes No

Text-CharWidth (0.04) *

It's faster than Unicode::GCString->new($str)->columns, but it gives wrong answers to lots of characters, e.g. control characters like "\n", "\t", etc are currently assumed to have width of -1 character. You're better off with Unicode::GCString.

Steven Haryanto - 2013-09-10T05:00:35 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

App-Options (1.12) **

2010-10-13:

I admit, this is not the most flexible configuration framework out there as it enforces some convention. And I don't/can't use it on every project. But it's certainly one of the easiest. You can slap a few lines of options declaration in your code and voila, your script suddenly can accept command line arguments, has --help message et al, read from config files (in several preset locations).

There are still a few annoyances (I submitted them in the RT), but in general, this is a very handy module to use for lazy coders who just want to accept configuration/options from outside the code.

<shameless plug>I'm trying to do somewhat the same with Config::Tree, but as of now the module is not really done yet.</shameless plug>

UPDATE 2013-08-15:

I'm reducing the ratings from 5 to 2. I've now avoided using this module due to two lingering issue since 2010: 1) App::Options does not accept '--opt val', only '--opt=val' which is incompatible with how most command-line programs work, causing confusion for some of my users. 2) 'perl -c' doesn't work under this module, it will still trigger command-line processing.

I'm now using Perinci::CmdLine as replacement, but I cannot recommend it in general, as the two modules are not equivalent.

Steven Haryanto - 2013-08-14T20:58:18 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Filesys-Notify-Simple (0.12) ****

It's rather unfortunate that currently the choice for general purpose cross-platform filesystem notification modules on CPAN falls between this module (FNS) or File::ChangeNotify (F::CN). The other CPAN modules are either OS-/framework-specific.

FNS has a simple API but is perhaps too simple for some uses, while F::CN uses Moose and has a big startup overhead.

If you simply want to check from time to time whether a change has occured, you need to wrap the wait() method with alarm(). And I found on my Linux PC that I need a timeout of at least 3 seconds for this to work reliably.

Steven Haryanto - 2013-07-04T20:56:05 (permalink)

Was this review helpful to you?  Yes No

experimental (0.005) *****

Vote +1 to add this to core. Please make coding in Perl 5 relatively painless.

Steven Haryanto - 2013-07-04T20:34:58 (permalink)

1 out of 2 found this review helpful. Was this review helpful to you?  Yes No

MIME-Lite-HTML (1.24) *****

Very straightforward to use (I needed to send a URL/webpage as HTML email with embedded images/objects). With this module I can finish my job with only a few lines of Perl in 3-5 minutes (searching for this module in CPAN takes more than that! searching using "mail web" or "email url" at first didn't get results).

Blackberry is having trouble displaying the resulting email though. No problem with Gmail or Thunderbird/Icedove.

Steven Haryanto - 2013-06-26T22:26:27 (permalink)

Was this review helpful to you?  Yes No

Term-Size (0.207) *

5-year old bug like RT#38594 still present. Use one of the alternate implementations like Term::Size::{Unix,Win32,ReadKey}.

Steven Haryanto - 2013-05-13T19:10:44 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

DateTime-Format-Flexible (0.25) ****

While it doesn't cover as much phrases as DateTime::Format::Natural, at least it's simpler to translate (and the dist already includes a couple of translations). BTW, I think like in the POD of DateTime::Format::Natural, it needs to list which phrases it supports. And probably add more :-)

Steven Haryanto - 2013-04-19T17:33:36 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

DateTime-Format-Natural (1.01) ***

I'm giving DateTime::Format::Natural 3 stars because while it's great for English (it covers more phrases than DateTime::Format::Flexible), it's also hard to translate. Look at the source code for DateTime::Format::Natural::Lang::EN: lots of Englishisms and weird structures (%grammars). Wonder why so far there has not been any translations to another language?

Steven Haryanto - 2013-04-19T17:32:16 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

App-sourcepan (0.01) ****

Thanks, just what I needed. (I was hoping cpanm would accept my --download patch, but this is just as well).

It still uses CPAN.pm and thus downloads the relatively big 01mailrc.txt.gz and 02packages.details.txt.gz file, thus slowing the first use. If you use cpanm exclusively, this is rather annoying especially if you're on a slow link.

Steven Haryanto - 2013-03-19T20:33:37 (permalink)

Was this review helpful to you?  Yes No

Text-ASCIITable-TW (0.04)

The method of determining visual width of Chinese characters is rather hackish. Text::ASCIITable should perhaps use Text::CharWidth (which can be used to determine visual width of text in other languages e.g. Japanese, etc) thus rendering this module unnecessary.

Steven Haryanto - 2013-03-12T10:52:05 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Text-VisualWidth (0.02)

Also look at Text::CharWidth for an alternative that can be used with text in other languages (Chinese, etc).

Steven Haryanto - 2013-03-12T10:50:04 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Text-VisualWidth-PP (0.01)

Also look at Text::CharWidth for an alternative that can be used with text in other languages (Chinese, etc).

Steven Haryanto - 2013-03-12T10:49:44 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Taint-Runtime (0.03) ****

Nice idea. Perl should really have included something like this (analogous to warnings.pm for -w).

However, for something as security-related as tainting, I personally think the interface is a bit too complex and not robust enough. There are too many pitfalls where one can fail to turn on tainting properly.

* First, user must remember to import $TAINT, or doing '$TAINT = 1' has no effect. There's no error/warning for this mistake.

* Then, if one also forgets to import taint_start or taint_start, then doing 'taint_start' or 'taint_env' (without parentheses) will do nothing. Also does not produce an error/warning except under strict mode.

* One must remember to 'taint_env' _after_ 'taint_start'. There's no warning/error if one does the opposite.

I'd rather have something like this:

{

use tainting;

... code is running in taint mode ...
}

use tainting;
{

no tainting;

... code is running without taint mode ...
}

No functions, no variables to set, no exports. Tainting of %ENV etc should be done automatically just like -T.

EDIT: I wrote tainting and uploaded it to CPAN as proof of concept.

Steven Haryanto - 2012-12-28T00:11:34 (permalink)

Was this review helpful to you?  Yes No

L (0.01)

Reinvents Class::Autouse (written 12 years ago). But at least L is much simpler and shorter to type (the equivalent of -ML is -MClass::Autouse=:superloader).

BTW, there's also Module::AutoLoad, Module::AutoINC, and lib::xi which can automatically install modules from CPAN and load them upon first use.

Steven Haryanto - 2012-12-26T07:34:23 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

UNIVERSAL-moniker (0.08)

Perl is not Ruby != everything Ruby does is horrible. This module has its uses.

Steven Haryanto - 2012-12-26T07:26:04 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Time-Out (0.11)

A wrapper around Perl's alarm()/$SIG{ALRM}, so it has the same limitations, e.g. you cannot use this to properly timeout external programs started by system()/backtick. For the latter, you might want to try IPC::Cmd (run() or run_forked()), or some simpler interface for it like System::Timeout.

Steven Haryanto - 2012-12-14T00:42:05 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Util-Timeout (0.01)

A wrapper around Perl's alarm()/$SIG{ALRM}, so it has the same limitations, e.g. you cannot use this to properly timeout external programs started by system()/backtick. For the latter, you might want to try IPC::Cmd (run() or run_forked()), or some simpler interface for it like System::Timeout.

Steven Haryanto - 2012-12-14T00:40:21 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

System-Timeout (0.07)

This is a thin wrapper over IPC::Cmd's run(). I'd personally use run() directly, it's not much harder or longer to type. Plus, IPC::Cmd is a core module.

Steven Haryanto - 2012-12-14T00:30:50 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Module-Quote (0.001)

Wouldn't a function like load_module("Math::Module")->new(42) be more obvious? Is there a specific goal for using custom quote operator (which requires Devel::Declare, and thus a C compiler to build)?

Steven Haryanto - 2012-11-26T16:40:21 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Module-Hash (0.001)

Wouldn't a function like load_module("Math::Module")->new(42) be more obvious? Is there a specific goal for using a tied hash (since there is already %INC)?

Steven Haryanto - 2012-11-26T16:38:04 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Promises (0.01) *****

5-star for its documentation.

Steven Haryanto - 2012-11-22T15:41:17 (permalink)

3 out of 6 found this review helpful. Was this review helpful to you?  Yes No

Lingua-ITA-Numbers (0.044)

Does the author care to explain the sudden influx of Lingua::<3-letter-code>:: modules (which look like mostly just repackaging of their corresponding Lingua::<2-letter-code>:: modules with no mention of purpose in the PODs)? The original modules are not orphaned either (for example, I still maintain Lingua::ID::*).

No Changes file. Versioning synchronized for all 3-letter modules with no indication of what version of the 2-letter-code module is used. For example, Lingua::ITA::Numbers' doc still says "decimals don't work properly", while Lingua::IT::Numbers' doesn't (however, needless use of Regexp::Common does gets removed).

Steven Haryanto - 2012-11-22T15:26:48 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

HTTP-Headers-Patch-DontUseStorable (0.02)

@zaxon: I'm not sure if it's a bug with HTTP::Headers, more like a workaround for Storable. See the FAQ in the updated v0.03 for more details.

Steven Haryanto - 2012-11-21T01:08:50 (permalink)

0 out of 5 found this review helpful. Was this review helpful to you?  Yes No

Storable (2.39) *

Balancing previous glowing reviews. Storable has it faults, for example historically its track record for file format backwards compatibility is poor, making programs fail when loading Storable files after the module is upgraded.

Also, more importantly, add builtin support for Regexp object already! It's almost 2013, Regexp object has been around for, what, more than a decade? I can understand not supporting serializing filehandle or coderef, but Regexp object?

Steven Haryanto - 2012-11-16T11:02:12 (permalink)

2 out of 5 found this review helpful. Was this review helpful to you?  Yes No

WWW-YouTube-Download (0.42) *****

Works for me too ATM. I've tried several command-line scripts (most of them Python-based, like youtube-dl, tubenick, etc). Sometimes they work, sometimes they broke. It's the nature of this kind of script. The quality comes from persistence. This module has been maintained since 2009, through several YouTube's changes. I commend the author, good job, and thanks!

Steven Haryanto - 2012-11-16T10:32:28 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Number-Zero (0.02)

From the module's POD: "The number zero and undef are difficult to determine in Perl."

Are they?

say !defined($data) ? "undef" : "not undef";

say defined($data) && $data==0 ? "zero" : "not zero"; # yes, warn if non-numeric

use Scalar::Util 'looks_like_number';
say looks_like_number($data) && $data==0 ? "zero" : "not zero";

Though I understand the need for a convenient "is_zero" function if you need to test for zero in a program a lot.

Steven Haryanto - 2012-11-15T22:35:42 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Syntax-SourceHighlight (1.1.2) ****

IMO, currently the only usable (read: non-crap) code syntax highlighting library on CPAN. Cons: you'll need to install GNU Source-highlight (and its development library/header) which pulls over 100MB of packages on my Debian.

Steven Haryanto - 2012-11-15T16:55:59 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Syntax-Highlight-Engine-Kate (0.07) *

Highlighter engine doesn't seem updated (for example, defined-or is not yet interpreted correctly by this module but already correctly by Kate itself). Does not provide default theme (must specify all colors). Seem to be very slow (takes 1.5s for a 18K Perl .pm file while Pygments only takes 0.2s).

Steven Haryanto - 2012-11-15T16:37:35 (permalink)

Was this review helpful to you?  Yes No

Syntax-Highlight-JSON (0.01) *

No documentation. Combines formatting and syntax-highlighting, so you cannot preserve original formatting. Only outputs to HTML and no default "theme" (CSS) provided.

Steven Haryanto - 2012-11-15T16:25:22 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Syntax-Highlight-Engine-Simple (0.09) ***

Output looks decent. However, it currently only formats to HTML/CSS (no ANSI, LaTeX, etc). Also, it needs more languages support.

Steven Haryanto - 2012-11-15T16:09:29 (permalink)

Was this review helpful to you?  Yes No

Syntax-Highlight-Universal (0.5) *

Only targets (X)HTML (i.e. no alternative output like ANSI or LaTeX). Supposedly slow. But it doesn't matter because code no longer builds (last updated in 2005).

Steven Haryanto - 2012-11-15T16:00:54 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

text-highlight (0.04) *

Outdated (no longer updated), poor capability (even for some simple Perl code, the output is atrocious), few languages supported. A far cry from Pygments or coderay.

Steven Haryanto - 2012-11-15T15:59:08 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

SemVer (v0.3.0)

Good for semantic versioning scheme like 1.2.3 vs 1.2.3alpha vs 1.2.3rc (1.2.3 should be the latest, not the alpha or rc). However, does not accept e.g. 1.0beta (at least three components are needed). Perhaps relax this requirement?

Also take a look at Debian::Dpkg::Version.

Steven Haryanto - 2012-11-13T23:28:35 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Sort-Versions (1.5)

Good for Perl-style versioning scheme (1.2.3) but does not work as people expect for semantic versioning scheme like 1.2.3 vs 1.2.3alpha vs 1.2.3rc (1.2.3 should be the latest, not the alpha or rc). For handling the latter case, use SemVer. Also take a look at Debian::Dpkg::Version.

Steven Haryanto - 2012-11-13T23:16:52 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

App-Countdown (v0.0.4) ****

Nice idea, though I'd probably just write a shell function for this.

Steven Haryanto - 2012-11-13T16:10:24 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Data-Compare (1.22) ***

Pros: handle hashes as well as arrays, handle nested and cyclic structure, plugins.

Cons: No cmp-like functionality (returning -1, 0, 1), slow (even slower than Array::Compare).

See also: Array::Compare, JSON/YAML/Storable.

Steven Haryanto - 2012-10-25T03:03:25 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Array-Compare (2.02) **

Pros: has a perm() function to check whether the two arrays contain the same things but in different order (although you can simply just run sort() over the arrays first). Allow skipping some elements from comparison.

Cons: no cmp-like functionality (returning -1, 0, 1), slow (for equality test, you might as well compare the json_encode() result of the arrays, which is way faster), no nested comparison. No procedural interface.

See also: Data::Compare, JSON/YAML/Storable.

Steven Haryanto - 2012-10-25T02:59:29 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Mozilla-Mechanize (0.06)

No longer builds (tested on a current Debian). A pity, since drop-in replacements for WWW::Mechanize (using different backend like curl, IE, Mozilla, Chrome, etc) might be handy.

Steven Haryanto - 2012-10-24T16:40:26 (permalink)

Was this review helpful to you?  Yes No

LWP-Curl (0.12)

Those looking for LWP drop-in replacement might want to take a look at the recently released LWP::Protocol::Net::Curl instead, which supports WWW::Mechanize.

Steven Haryanto - 2012-10-24T16:36:55 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

LWP-Protocol-Net-Curl (0.001) *****

Shows great promise. I personally need this for HTTPS proxy support. After testing, the module still doesn't work to login to my internet banking sites. But I'll still check in from time to time.

Steven Haryanto - 2012-10-24T16:28:12 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Devel-SizeMe (0.04) *****

Wow, just wow. Hopefully now that we can use this tool to know how big things are, we are encouraged to create leaner, faster, more efficient Perl modules.

Steven Haryanto - 2012-10-10T18:53:24 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Oktest (0.0103) **

A reinvention of Perl testing modules (it even comes with an equivalent for 'prove' command), with probably no added features and some added quirks. (Nested) topic can already be done using Test::More's subtests. Filtering and setup/teardown can be done with Test::Class. And I am supposed to replace specific assertion functions (with specific, helpful error messages) like is(), isnt(), like(), is_deeply(), etc with just OK()?

Steven Haryanto - 2012-10-09T17:30:27 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

HTML-Escape (1.02) *****

Still a bit slower than PHP's htmlspecialchars(), but in the same ballpark. An order of magnitude faster than HTML::Entities. Does not provide unescaping, but it's okay since escaping is the majority of use cases.

Steven Haryanto - 2012-10-01T17:51:38 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Clone-Fast (0.96.2) ***

Casual benchmarking on my PC shows that Data::Clone is up to twice faster than this.

Steven Haryanto - 2012-10-01T17:45:23 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Perl-Strip (1.1) ****

Balancing previous unhelpful review. Slowish (can't complain, PPI-based) but works and comes with a command-line utility.

Beware though that the command-line utility modifies file in place without backup, without warning, and without option to create backup.

Steven Haryanto - 2012-09-13T17:42:33 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Perl-Squish (1.06) *

Have failed to build for 1.5 years (reported bug RT#66958 left untouched, users need to install Module::Install first). No usage documentation.

Steven Haryanto - 2012-09-13T17:23:48 (permalink)

5 out of 5 found this review helpful. Was this review helpful to you?  Yes No

perlsecret (1.002) *****

Nice collection of perl shortcuts. Today I forgot about the name for "x!!" and nicely found it in this module.

Steven Haryanto - 2012-09-06T23:09:34 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

PerlX-ArraySkip (0.001)

Cute idea as always, though I'd rather use comments rather than taking multiple sub calls hit.

Steven Haryanto - 2012-09-05T16:34:49 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

App-perlfind (2.05) *****

A timesaver. Using it on a daily basis (aliased to "pod"). Thanks, Marcel!

Steven Haryanto - 2012-09-04T17:04:24 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

PerlX-Maybe (0.002) *****

A nice syntax addition for avoiding passing or writing a bunch of undefs. More convenient to write than using ternary operator or grep. I'm beginning to adore syntax modules like this (as long as it adds negligible overhead).

Steven Haryanto - 2012-09-04T03:53:33 (permalink)

4 out of 6 found this review helpful. Was this review helpful to you?  Yes No

File-Path-Tiny (0.4) ***

I like the concept, but do not like the overly short names mk() and rm(). Instead of mk(), how about mkdir_p() or mkpath() like in File::Path. Instead of rm(), how about rm_r() or rmtree() like in File::Path.

Steven Haryanto - 2012-09-03T20:09:33 (permalink)

1 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Exporter-Lite (0.02)

2011-10-04: I am now using Exporter::Lite exclusively instead of Exporter. Got bit once by Exporter when using for an OO module due to clash of assigning to @ISA vs 'use base'. +1 for putting it into core.

EDIT 2012-08-08: Nowadays I revert back to Exporter most of the time because Exporter is core. To avoid @ISA issue, one simply needs to import import() instead setting @ISA:

use Exporter qw(import);

Steven Haryanto - 2012-08-07T18:20:14 (permalink)

1 out of 4 found this review helpful. Was this review helpful to you?  Yes No

YAML-Syck (1.20)

To be fair, in my experience YAML::Syck is not "much more buggy" than ::XS. It even sometimes works with my YAML data while ::XS crashes. Go figure.

Steven Haryanto - 2012-08-03T08:29:41 (permalink)

Was this review helpful to you?  Yes No

Devel-FindPerl (0.004)

IMO the module should explain in the POD, in what cases using $^X is not enough or how it is different from Probe::Perl.

Anyway, quoting CPAN Testers' CPAN Authors FAQ, $^X is not enough when:
1) perl was executed with a relative path and the script has chdir()ed; 2) because $^X originates in C's argv[0] (in the main() function) it is possible for the calling program to exec() in such a way that argv[0] isn't the path to the interpreter; 3) HP/UX can do weird stuff in scripts that use #!; 4) VMS. (Not clear about #4 though :) ).

Steven Haryanto - 2012-07-25T18:08:57 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Taint-Util (0.08) *****

IMO this is the best module to deal with tainting. BTW there are several other modules like Taint (only provides taint + tainted, no untaint), Untaint (only provides untaint with awkward interface, like $v = untaint(qr/.../, $v)), Scalar::Util (only provides tainted), Test::Taint (does not provide untaint but provides taint_deeply and test predicates), and several others.

Steven Haryanto - 2012-07-19T17:47:19 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Markdown-Pod (0.002) **

I use Markdown::Pod for my module Perinci::To::POD.

This module does not output proper POD for many (not so) edge cases, like:

`>` and the likes are not yet escaped, producing C<>> when it should have been C<< > >> or C<E<gt>>.

Ordered list numbering does not yet work, e.g. "2. ...\n3. ...\n" produces "=item 1. ... =item 1. ..."

Ordered list with item numbered other than 1 does not work (see above). This should be supported in POD because POD allows us to write the bullets/numbers for each item.

Inline markup is not smart enough to differentiate word_with_underscore. So "foo_bar and foo_baz" becomes "fooI<bar and foo>baz".

Plus it segfaults sometimes (might be my perl though).

Steven Haryanto - 2012-06-18T08:06:28 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Lingua-Metadata (0.002)

As previous reviewer noted, this module is actually just a front-end to the author's web service. Plus license is specifically BSD (which allows this module to be included in closed source projects), this is rather ironic to me.

Steven Haryanto - 2012-06-15T18:32:35 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Finance-Currency-Convert-WebserviceX (0.07001) *****

Simple, no-fuss interface, recommended. As mentioned in the doc, the alternatives have some downsides: Finance::Currency::Convert::Yahoo is based on web scraping while ::XE has usage limits.

Steven Haryanto - 2012-04-30T19:19:25 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Carp-Always-Color (0.06) *****

Like Carp::Always? Want something better? Here it is.

Steven Haryanto - 2012-04-25T02:08:24 (permalink)

Was this review helpful to you?  Yes No

Log-Any (0.14) *****

The DBI of logging. Stop reinventing your own logging framework (unless for learning purposes, I guess) and just use this.

Steven Haryanto - 2012-04-24T05:21:50 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

CHI (0.56) ****

The DBI of caching. Stop reinventing your caching framework and just use this.

UPDATE 2013-01-16: unfortunately, the use of Moose reduces the usefulness of CHI for command-line scripts (0.2s/146 files/53k lines startup overhead just to initialize a File cache). So 4 stars instead of 5. Let's hope the author migrates to Moo someday.

Steven Haryanto - 2012-04-24T05:20:53 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Monkey-Patch (0.03) *****

Compared to several other monkey-patching modules (like Sub::Monkey or Class::Monkey) I prefer this one because the interface is simplest and the documentation is the most straightforward. Plus it can do stacked patching and unordered restore, which is cool.

Steven Haryanto - 2012-04-24T05:18:55 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Log-AutoDump (0.05)

This module is simple and to the point. Unfortunately, if you're a user of Log4perl or other logging framework, you'll have to switch just for a single feature (autodumping).

An alternative is to use Log::Any, which also features autodumping (via $log->debugf("%s", $complex), $log->warnf(), and friends), while still allowing you to use Log4perl and other frameworks supported by Log::Any.

Steven Haryanto - 2012-04-24T05:15:25 (permalink)

Was this review helpful to you?  Yes No

List-Pairwise (1.00)

Two nice and possibly very useful functions. But IMO the names 'mapp' and 'grepp' are two similar to 'map' and 'grep', making it prone to typos and misreading. Perhaps consider 'map2' and 'grep2'?

Steven Haryanto - 2012-03-29T17:18:00 (permalink)

0 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Log-Log4perl-Appender-File-FixedSize (0.01)

Module name should perhaps be Log::Log4perl::Appender::File::RoundRobin to make it clearer that the backend is File::RoundRobin.

Steven Haryanto - 2012-03-27T23:36:20 (permalink)

Was this review helpful to you?  Yes No

Any-Mo (0.30)

Why exclude Moo?

Also the issue with any Any::* (or Any::*) modules is that there should be a mechanism (preferably a common one) to adjust the ordering. Sometimes I prefer Moose first, for full capability or compatibility or whatever. Sometimes I prefer Mouse or Moo, for quick startup (but don't mind Moose if those are not available). This also happens to me for YAML::Any: in some cases I prefer YAML::Syck, in others YAML::XS, this depends on the data that I'm handling.

Steven Haryanto - 2012-03-20T17:00:09 (permalink)

1 out of 5 found this review helpful. Was this review helpful to you?  Yes No

PerlX-Perform (0.004)

I personally don't see much value of this syntactic sugar since Perl already allows us to express clearly. Pick one:

for ($foo) { say $_ if defined }

for (grep {defined} $foo) { say $_ }

do { say $_ if defined } for $foo

say $_ for grep {defined} $foo

And save yourself from having to remember whether we should add a comma or not before "wherever".

Steven Haryanto - 2012-03-05T06:16:12 (permalink)

1 out of 2 found this review helpful. Was this review helpful to you?  Yes No

TOBYINK-PerlX-A (1)

I have nothing against bundles like this, but beware that adding 'use TOBYINK::PerlX::A' will cause Perl to load 460 files and compile +- 160k lines (takes 1s on my Core i5 machine and 8s on my Atom netbook).

Steven Haryanto - 2012-02-21T09:57:20 (permalink)

1 out of 2 found this review helpful. Was this review helpful to you?  Yes No

WWW-Google-Images (0.6.5)

Just adding a note that this module is unmaintained (as expressed by the author) and has stopped working for some time. If you are looking for alternatives, try REST::Google (which includes REST::Google::Search::Images). The latter has been working OK for me.

Steven Haryanto - 2012-02-21T04:15:52 (permalink)

4 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Acme-Damn (0.05) *****

5 stars for cute metaphor (there's also Acme::Holy by the same author, but that is just another implementation of Scalar::Util's blessed()) and for prompt support from the author.

I'm sure there exists a real use case to move this out of Acme::, however obscure that might be. Can't come up with any right now, all I can think of is reblessing, which can be handled with bless() from the start.

UPDATE 2013-09-11: I found a real use-case for it! Cleaning up data to be sent to JSON. BTW, Data::Structure::Util also has an unbless() function, but Acme::Damn is smaller and faster. Data::Structure::Util also currently doesn't build on Windows.

Steven Haryanto - 2012-02-14T10:51:28 (permalink)

3 out of 5 found this review helpful. Was this review helpful to you?  Yes No

WWW-Parallels-Agent (v0.0.2-TRIAL)

@Justin Case: The name is unfortunate, but it's already proper (WWW:: followed by website or company name). HTTP client libraries are in LWP::. But VM:: is also an apt choice.

Steven Haryanto - 2012-02-08T21:47:56 (permalink)

1 out of 5 found this review helpful. Was this review helpful to you?  Yes No

Underscore (0.01)

I don't know why Sawyer X's review is marked as unhelpful (2 out of 8), but I agree with him. This is *not* an Acme module, it's a port of a JavaScript library of the same name.

Steven Haryanto - 2012-02-07T19:57:46 (permalink)

6 out of 11 found this review helpful. Was this review helpful to you?  Yes No

Locale-Geocode (1.2) *

Sorry to have to rate with 1 star. I don't have problem with the interface/documentation. The 1-star rating is just to warn people that the data used by this module is not up to date. And that YEARS-old bugs are not being fixed.

At the time of this writing, this module still uses ISO 3166-2:1998 (first edition) + the newsletters (minor updates) up to 2006. When it should be updated to ISO 3166-2:2007 (second edition) + all the newsletters. For example, this module does not report 3 newer provinces in Indonesia.

Sadly we live in a world where countries and subcountries change all the time.

Steven Haryanto - 2012-02-07T17:07:11 (permalink)

2 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Locale-SubCountry (1.56) ****

UPDATE 2012-08-30: I am not sure if the module is now fully compliant to the new ISO 2007, but bug reports are certainly being responded and resolved now. Updating rating from 1-star to 4-star. Thanks, Kim.

2012-02-17: Review to version 1.47:

Sorry to have to rate with 1 star. I don't have problem with the interface/documentation. The 1-star rating is just to warn people that the data used by this module is not up to date. And that months-old bugs are not being fixed.

At the time of this writing, this module still uses ISO 3166-2:1998 (first edition) when it should be updated to ISO 3166-2:2007 (second edition) + all the newsletters (minor updates). For example, this module does not report 3 newer provinces in Indonesia.

Sadly we live in a world where countries and subcountries change all the time.

EDIT: Ok, so I was not being clear that I was not talking about my own bug report (posted at about the same time of this review). And bugs were certainly being resolved up to about 7 months ago.

Steven Haryanto - 2012-02-07T17:04:09 (permalink)

2 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Data-Rmap (0.62) *****

A very handy utility, sort of like s/// on your nested data structure instead of just strings. One nitpick: no coderef support. I needed to replace all coderefs inside a data structure into a string, since I want to pass it to JSON encoder. None of the rmap_*() functions seem to let me get to the coderefs. (RT wishlist ticket added.)

UPDATE 2011-12-30: The author (Brad) quickly responded to my RT ticket and added rmap_code. Upgrading from 4- to 5-star :) Regexp support is not there yet though, and I have suggested the ability to get all kinds of Perl-specific and weird objects, because one of the main uses of Data::Rmap for me is to "clean" a data structure to pass to non-Perl systems.

Steven Haryanto - 2011-12-29T17:47:24 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Data-Properties-JSON (0.003)

The abstract for this module is a bit strange. What does this have to do with 'test fixtures'? Also the documentation doesn't say much, e.g. What will happen if a hash key contains funny characters (or arrays, etc)?

A similar module in spirit is Data::Hive. I think "providing convenient chained method access to hierarchical data" should be refactored out. So perhaps Data::Properties::{JSON,YAML,...} should just be a convenient shortcut for {JSON,YAML,...} parser + Data::Hive.

Steven Haryanto - 2011-12-28T18:52:34 (permalink)

Was this review helpful to you?  Yes No

Exporter-Auto (0.01)

I discourage module authors from exporting like this because it's simply too impolite/intrusive for module users. If the module author is lazy, there is already Exporter::NoWork which offers a few options for module users. This module, on the other hand, gives no control at all for users (so they'll have to resort to 'use Module ();').

Let me remind all again by quoting from Exporter's POD: "Do *not* export anything else by default without a good reason! Exports pollute the namespace of the module user."

Steven Haryanto - 2011-12-14T00:44:47 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Net-Douban (1.11)

Interface to web services should be put under WWW::*, not Net::*

Steven Haryanto - 2011-12-05T23:13:48 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

HTML-Form-XSS (0.3)

Should probably be put under Test::*?

Steven Haryanto - 2011-12-05T23:13:03 (permalink)

Was this review helpful to you?  Yes No

Thread-IID (0.010_001)

When I saw the perlmonks thread yesterday, I thought "well, someone should package it and put it on CPAN". And then someone did :) Thanks.

Steven Haryanto - 2011-12-01T16:33:59 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Test-Lite (0.006)

This is just a reimplementation of Test::More. But I thank the author for writing a short description of why this module is written, how it is different from others, and suggestion of what modules users should use. There are a lot of wheels being reinvented on CPAN, and that's okay, I just wish more people would document the reason.

Steven Haryanto - 2011-11-29T15:45:09 (permalink)

Was this review helpful to you?  Yes No

Sub-Mage (0.016)

Since the first release, there are 13 subsequent releases in total. What are the changes between releases? No idea, the author doesn't bother to update Changes (and no public repo is listed). Apparently all his other modules are also like this. Not very user-friendly.

UPDATE 2011-11-22: I see that this has been rectified by the author, there is now Changes entry for each new release. Cool, thanks.

Steven Haryanto - 2011-11-17T07:05:12 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

relative_lib (0.3)

Documentation is placed in README.md, so it's inaccessible from perldoc et al. Why? This is not a Python library.

Steven Haryanto - 2011-11-09T03:33:58 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

CPAN-Mini-Webserver (0.57) *****

Just found out about it, despite having used CPAN::Mini for over a year. Helps *a lot*. More people should know this (e.g. mention from CPAN::Mini POD).

Steven Haryanto - 2011-11-09T03:18:02 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Win32-App-which (1.02)

I don't use this module since I'm not on Windows. But why another module? File::Which also handles Win32 (probably not the "the current directory is explored before PATH" thing, but you should consider submitting a patch).

At least the documentation should state why this module is necessary. It complicates scripts by having to select between two 'which' implementations.

Steven Haryanto - 2011-11-03T19:11:05 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Devel-Platform-Info (0.09) *****

I knew CPAN wouldn't let me down. Now I can discard my own OS/platform detecting code (which probably is buggier and not nearly as extensive) and rely on Devel::Platform::Info instead.

Devel::Platform::Info gives information not only about the OS but also architecture, kernel type & version, etc. In my case I need to detect distro name, its version, and its codename. All of those are provided.

This module is so new though (started in 2010) so I wonder whether this need has never come up before.

Steven Haryanto - 2011-11-01T02:54:59 (permalink)

5 out of 5 found this review helpful. Was this review helpful to you?  Yes No

Package-Builder (5.03) *

Less boilerplate please!

Steven Haryanto - 2011-09-21T03:47:17 (permalink)

1 out of 3 found this review helpful. Was this review helpful to you?  Yes No

File-LibMagic (0.96) ****

After comparing against File::MMagic, File::MMagic::XS, File::Type, I ended up choosing File::LibMagic because it has the least problems and looks like being the most maintained (although it would be nice if the author cleans up the RT queue).

For those stuck without a C compiler, File::Type or File::Magic can be an alternative.

Steven Haryanto - 2011-06-15T03:57:24 (permalink)

5 out of 5 found this review helpful. Was this review helpful to you?  Yes No

File-MMagic-XS (0.09006) **

Last time I checked, still can't parse system magic database, e.g. /usr/share/file/magic (bug first filed in RT 4 years ago).

The currently recommended module in this area seems to be File::LibMagic. Other alternatives include File::MMagic (slow and buggy, no longer maintained), Media::Type::Simple (only maps MIME type from/to file extension).

Steven Haryanto - 2011-06-15T02:55:05 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

File-MMagic (1.27) **

Works for basic usage, but has quite a few problems. Plus it is not very performant. Doesn't seem to be maintained anymore.

The currently recommended module in this area seems to be File::LibMagic. Other alternatives include File::Type (gives less useful results), File::MMagic::XS (also not actively maintained? long standing bugs like failure to parse system magic file still persists), Media::Type::Simple (only maps MIME type from/to file extension).

Steven Haryanto - 2011-06-15T02:52:19 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

File-Type (0.22) *

As another reviewer has said, this module tends to conclude "application/octet-stream" for many kinds of files, making it not very useful.

The currently recommended module in this area seems to be File::LibMagic. Other alternatives include File::MMagic (slow, has quite a few bugs, no longer maintained), File::MMagic::XS (also not actively maintained? long standing bug like failure to parse system magic file still persists), Media::Type::Simple (only maps MIME type from/to file extension).

Steven Haryanto - 2011-06-15T02:35:28 (permalink)

4 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Time-Mock (v0.0.2) *****

Balancing previous 1 rating by @Ingo.

To Ingo: You said module's documentation is okay, one feature you use works okay, and other features you don't use. Why only 1 star then?

This module is a worthy alternative to Test::MockTime. It offers extra features such as working across forks, mocking Time::HiRes (eventually), and speeding/slowing down time.

Steven Haryanto - 2011-05-16T08:06:18 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Sakai-Stats (0.01) *

Release early, release often indeed. First you release nothing but boilerplate :)

Steven Haryanto - 2011-05-12T06:17:01 (permalink)

0 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Spreadsheet-Perl (0.11)

Good documentation. All modules' documentation should similarly strive to contain at least: rationale for existence, pointer to alternatives, and task-oriented organization.

Steven Haryanto - 2011-05-11T01:30:12 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Unix-PasswdFileOps (0.4) **

Less-than-descriptive name (module's main function seems to be sorting entries, can't be guessed from the name). No unit tests. Doesn't handle /etc/shadow. Also, it might be useful to explain why one needs to sort entries in passwd file.

Steven Haryanto - 2011-04-27T22:18:13 (permalink)

Was this review helpful to you?  Yes No

Array-Diff (0.07) *****

Yes, simple and gets the job done. Though I'm a bit curious with the implementation. If the interface is only to get number of deleted and added items (instead of positions of deletion/insertion), why depend on Algorithm::Diff (or use the name 'diff', for that matter).

Steven Haryanto - 2011-04-21T22:17:55 (permalink)

Was this review helpful to you?  Yes No

DZ1 (0.001) *

Why do we need this uploaded to CPAN?

Steven Haryanto - 2011-04-20T18:15:08 (permalink)

3 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Passwd-Unix (0.621) *

No tests. No detailed error status, only true/false (yes, there is a 'warnings' parameter on constructor, but this doesn't give out warnings on all operations, only some). No locking (although there is backup, but still).

Also, some weird choices, why use bzip2 when creating backup? Or, why still require running as root (checking $() if we are allowing custom database file location?

Between this and Unix::ConfigFile, I'm seriously considering using Unix commands instead (useradd, userdel, gpasswd, et al).

UPDATE 2011-04-21: I created a fork of Passwd::Unix 0.52 called Passwd::Unix::Alt instead, which add some tests and modifications. Try it out if your needs are also not met by Passwd::Unix.

UPDATE 2012-08-30: I created a new module called Unix::Passwd::File. Try it out if your needs are also not met by Passwd::Unix.

Steven Haryanto - 2011-04-20T06:02:56 (permalink)

Was this review helpful to you?  Yes No

Unix-ConfigFile (0.06) *

Outdated module that doesn't handle /etc/shadow and /etc/gshadow.

Steven Haryanto - 2011-04-20T02:25:42 (permalink)

Was this review helpful to you?  Yes No

lib-xi (0.09) *****

Handy module for installing dependencies. There are previous efforts, but the arrival of cpanm makes autoinstall process less tedious, so hats off also to the creator of cpanm.

Steven Haryanto - 2011-03-30T02:08:02 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Capture-Tiny-Extended (0.102) *****

Indispensable. Provides nice enhancement to Capture::Tiny (particularly the real-time teeing).

Steven Haryanto - 2011-03-30T02:05:45 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

google_talk_bot (v_01) *

Improperly packaged, improper POD formatting, bot messages hardcoded in script, and yes... idiotic license. Basically a "trial" script to bait users into consultation gig. CPAN is not a place for this kind of thing. Please try again.

Steven Haryanto - 2011-03-15T19:07:41 (permalink)

5 out of 6 found this review helpful. Was this review helpful to you?  Yes No

Clone-Any (1.01) **

Using Clone::Any nowadays is more trouble than it's worth.

First, there are annoying incompatibilities between cloning modules. Most notably Storable, which is the default cloning module if Clone is not available, *still* doesn't support storing Regexp objects out-of-the-box after all these years.

Second, this module has not been updated for a long time and newer alternatives like the fast Data::Clone is not recognized.

Right now I'm replacing all code from using Clone::Any code to Data::Clone.

Steven Haryanto - 2011-03-15T19:02:22 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Array-OrdHash (1.03) *****

Fun module to play with, especially for those among us infected with a bit of PHP envy (me, never!).

Steven Haryanto - 2011-03-09T20:52:55 (permalink)

0 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Bash-Completion (0.001) ***

Clean code, plugin interface simple to use, but implementation needs to be improved. For example, parsing $ENV{COMP_LINE} & $ENV{COMP_POINT} into @argv is done simplistically using split(/\h+/), without regard to shell's quotes/escapes. (Getopt::Complete's way is somewhat better by invoking shell, but it also has its problems. I guess in this regard external programs are second-class citizens to shell functions because they don't get the equivalents of COMP_WORDS/COMP_CWORD).

Steven Haryanto - 2011-02-18T05:50:47 (permalink)

Was this review helpful to you?  Yes No

Bash-Completion-Plugins-cpanm (0.0.1) ****

Cool, except that with cpanm I often install local distribution (cpanm Foo-Bar-1.23.tar.gz). Perhaps the completion can look in the filesystem first before firing API request. Also, might be nice if there is some caching because it seems to be slow (at least from where I am).

Steven Haryanto - 2011-02-17T22:49:58 (permalink)

Was this review helpful to you?  Yes No

Switch (2.16)

With all due respect to the author, Switch is no longer necessary in 5.10+ as 5.10+ already introduced smart matching and given(). given() is superior because it doesn't introduce compile-time overhead, doesn't mess line numbers, and should be faster (simply because smart match is fast, and Switch is not utilizing it).

You have been using 5.10+, right? (Since 5.8 is no longer officially supported)

Steven Haryanto - 2011-02-14T18:29:00 (permalink)

2 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Moo (0.009005) *****

Last week I ported an application from Mouse (Any::Moose) to Moo. Went without a hitch (well I did replace "with 'X', 'Y', 'Z';" to "with 'X'; with 'Y'; with 'Z';" as instructed in the Moo documentation). Startup time decreased significantly. Planning to move every Moose apps to Moo. Splendid!

Steven Haryanto - 2011-02-14T07:01:58 (permalink)

5 out of 8 found this review helpful. Was this review helpful to you?  Yes No

Sub-StopCalls (0.01) ****

Cool idea, if a bit extreme.

If computing a value is expensive, there's Memoize for the caller. On the callee side, you can cache the result (there's state variable in 5.10+ so it's dead simple to use).

So I believe Sub::StopCalls is only necessary if you find the overhead of the sub call itself to be a bottleneck. And if that is the case, perhaps you should refactor the calling code anyway.

Steven Haryanto - 2011-02-11T00:44:30 (permalink)

1 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Log-Log4perl-Tiny (1.0.0) *****

5 stars solely for the idea (I'm beginning to love the ::Tiny movement more and more these days). Haven't actually tried it though, but I bet many Log4perl users, me included, mostly only use easy_init. As much as Log4perl is mature and fairly optimized, it's still a relatively "huge" library. Nice to know there's a drop-in ::Tiny replacement.

Steven Haryanto - 2011-01-25T07:07:38 (permalink)

1 out of 3 found this review helpful. Was this review helpful to you?  Yes No

SHARYANTO-YAML-Any (0.721)

Re: Blue. I guess I shouldn't release this. I need something quick to fix our application, so this is not really something meant for public use. Will be purging this from PAUSE.

Steven Haryanto - 2010-12-15T23:11:11 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

SQL-Easy (0.01) *

IIRC, there has also previous similar attempt like this. Modules like these are not necessary, as DBI already has something equivalent (and even better): selectrow_{array,hashref,arrayref} and selectall_{array,hash}ref.

Steven Haryanto - 2010-12-04T08:23:07 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

CGI-Struct (1.12) *****

Cool, will definitely try this out the next time I write another form processing CGI script. Although the module is named CGI::, there's nothing CGI-specific about it, and that's good. So this module is basically a "path-expander" for hash values.

Btw, one thing I use rather often in PHP is naming parameter as "foo[]" which will automatically add elements to the $_REQUEST['foo'] array. Perhaps this feature can be considered too.

Steven Haryanto - 2010-12-04T08:14:58 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

DateTime-BusinessHours (1.01a) ***

Just tried it. It works, but the module/dist is not in the best shape:

* Test fails (pod-coverage, error in POD)

* dependency on Class::MethodMaker not yet specified

* Documentation: Synopsis contains mistake (class name is DateTime::BusinessHours not BusinessHours), the name '$testing' is not very suitable, there are typos.

* Style-wise, method naming is "joinedwords", while in DateTime families it's "separated_words" (not a big deal though).

Steven Haryanto - 2010-12-03T05:49:11 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Bundle-Dpchrist (1.037)

Every once in a while everyone of us encounters a programmer that disregards existing reusable code and creates his/her own "standard library" for everything, from trimming string to creating random number to cleaning the kitchen sink. We all might have been one too, at one time or another. I'm not saying that this bundle is a case of the above, but it's giving me a similar feeling. :-)

A commendable effort, David. But there really are a lot of wheels being reinvented here.

Steven Haryanto - 2010-11-29T22:24:48 (permalink)

6 out of 6 found this review helpful. Was this review helpful to you?  Yes No

Net-BitTorrent-File (1.02-fix) *****

I mass download stuffs by putting a bunch of torrent files in a directory on the server and let rtorrent takes care of them. With this module I can quickly whip up a short script to calculate the total size of the downloadable files so I can be pretty sure that when I leave my server for days/weeks, I don't run out of disk space because I put in too many torrent files.

Steven Haryanto - 2010-11-24T09:33:39 (permalink)

Was this review helpful to you?  Yes No

Module-CoreList (2.41) *****

Wow, I was thinking the same exact "godsend" too and turns out some other reviewer already said so. Very very helpful to assist deployment and pick modules to use. I personally made a couple of command-line scripts like pm-in-core or core-since-when to save some typing.

Steven Haryanto - 2010-11-24T09:29:57 (permalink)

Was this review helpful to you?  Yes No

WWW-Mechanize (1.66) *****

WWW::Mechanize is of course one of the indispensable tools for any web programmer or admin. The current problem is the proliferation of 3rd party subclasses, the functionalities of which cannot be used together. So you want a polite Mechanize which does self-rate-limiting and uses the Firefox or IE engine? A subclass exists for each feature, but how do you use them together? WWW::Mechanize needs to be more role/plugin-oriented instead of inheritance-oriented.

Steven Haryanto - 2010-11-24T09:25:46 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Mail-Sendmail (0.79) ***

I used Mail::Sendmail and a few others "older" modules back from the days when it didn't support setting envelope sender different from RFC From, and when the test hung on some dead host.

If it's still working for you, great. I personally have moved on to other modules like Email::Sender::Simple, which abstracts sending mechanism (transport) and support SMTP auth, for two. Also, many of the guide/documentation for Mail::Sendmail are not quite up to date in style (though they still might work), for example the low level way of building HTML email. Also, the Changelog file doesn't seem to be maintained?

Steven Haryanto - 2010-11-24T09:08:27 (permalink)

Was this review helpful to you?  Yes No

autodie (2.10) *****

I started using autodie in almost all of my applications a few months ago. It's somewhat of a mixed blessing. For existing applications, it can break things and making things less robust, solely because old code are not built with autodie in mind.

But the best thing about it is that it's lexically scoped, so for sections of code that you're not sure about, just sprinkle 'no autodie' to get the old behaviour.

It should be used on probably 95% of code out there. For the rest of the cases, where you need to report the status of each I/O operation, it's obviously more convenient to check $? instead of trapping exception everytime.

+1 for getting it into core.

Steven Haryanto - 2010-11-24T08:55:23 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

App-FileTools-BulkRename (0.04) ****

Disclaimer: I maintain a "competitor" module, App::perlmv. Apparently a lot of people, like me, likes to rename files using Perl. And the examples in the documentation are about renaming movie files too, something which I do a lot :)

I applaud Stirling Westrup for taking a legacy script and improving it. May we have a lot of ideas to borrow from each other.

This is an early release, there are quite a few things I find lacking. Most importantly, I suggest adding a test suite as soon as possible. The filesystem differences can be tricky, and CPAN Testers can help providing feedback.

Keep up the good work.

Steven Haryanto - 2010-11-24T08:48:03 (permalink)

Was this review helpful to you?  Yes No

Script-State (0.01) *****

Nice idea, straight and simple interface. A better name could perhaps be chosen? Documentation should be expanded, e.g. to warn users about security, since Data::Dumper a.k.a. eval() is used to load variable content. Also, the implementation does not yet consider file locking.

Steven Haryanto - 2010-11-22T08:17:30 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

PathTools (3.33) ****

I guess File::Spec's API is sane enough, but I suspect not a lot of people are using it because there's not enough incentive for it. When 99% population of the world use Unix/Linux/Windows (even Macs been technically Unix for a number of years), "/" works everywhere and using File::Spec does not gain you anything except lots of typing exercise.

That's why I think Path::Class might have a better chance of succeeding. It gives niceties like a few more convenience methods, a shortcut of getting dir & file object from each other, etc. It gives users more incentive of using a proper path manipulation library because it gives extra stuff along with that. It should also be in core to accompany File::Spec.

Steven Haryanto - 2010-11-22T08:06:19 (permalink)

2 out of 3 found this review helpful. Was this review helpful to you?  Yes No

File-Slurp (9999.13) ***

I've been using File::Slurp for years and is generally satisfied with it. However reading the negative reviews today and looking at its RT queue, I realize that this module is broken for many and is effectively abandoned by the maintainer (no new releases for almost 3 years now despite several RT items labeled as critical). So I suggest others checking out the alternatives.

My wishlist for File::Slurp is: a reading mode to automatically chomp newline (very useful for reading simple one-line files).

UPDATE: The maintainer said that a new release is being prepared, along with my new wishlist. Yay!

Steven Haryanto - 2010-11-18T19:21:53 (permalink)

3 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Log-Log4perl (1.31) *****

It's a very mature and an excellent logging framework. However, some of the common minor complaints are: 1) It's too complex. I agree: it should not be this hard to get started. 2) Configuration is too verbose. Agreed: but well, what can you do, most things from Java is a bit overengineered and verbose anyway. At least you can do almost anything with the configuration. 3) It's not very Perlish. Also agreed. 4) Performance. My note: speed is not an issue in majority of the cases and Log4perl's performance is adequate for most of the rest of the cases. For faster/leaner alternatives you might want to take a look at Log::Fast, but a lot of Log4perl's features are missing.

One of the main strengths of Log4perl is its sublogger/subcategory feature, which few other frameworks seem to have.

For other alternatives, also take a look at: Log::Handler, Log::Any. And of course Log::Message too.

Steven Haryanto - 2010-11-18T16:14:42 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Log-Handler (0.67) ****

This review mostly compares Log::Handler with Log4perl, which is a mature and one of the most popular logging frameworks.

I think Log::Handler's interface is much simpler, nicer, more Perlish than Log4perl. It's a bit similar to Log::Any::App, which I created just because I hate Log4perl configuration.

There is a unique concept of maxlevel not normally found in other frameworks, though it can be emulated in other frameworks using filters.

At a quick glance, the speed is around twice that of Log::Log4perl, so I'll say it's on the low-end side (there are other much faster logging modules, but anyway speed is not an issue to most people).

It currently lacks sublogger (hierarchical categorization and adjustable/automatic appending of subcategory to its parent), so it cannot be used to replace Log4perl in most cases as that's one of the main feature of Log4perl. Which is a pity because I would otherwise switch.

Steven Haryanto - 2010-11-18T16:03:52 (permalink)

1 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Log-Fast (1.0.0) *****

This logging framework is also minimalistic: no categories/hierarchiecal loggers, no custom levels, no config file, or other whistles and bells. And the interface & default levels are rather syslog-oriented. But it's fast alright. The POD doesn't mention a comparison to Log::Log4perl, but a casual benchmark shows that it's at least 10x faster.

So this module will certainly come handy if you have a performance critical application.

Btw, note that the benchmarks are done for actual logging to output. For log statements that do not actually get logged (e.g. because the level is below the desired output level), I don't find that extreme differences in overhead between logging frameworks. For example, on my Athlon64 X2 5600+ PC, Log::Fast's overhead is roughly around 3mils/sec, while Log::Log4perl is around 1,5mils/sec.

Steven Haryanto - 2010-11-17T19:50:25 (permalink)

1 out of 3 found this review helpful. Was this review helpful to you?  Yes No

Log-Minimal (0.03) **

Log::Minimal's slogan is "minimal but customizable". It's minimal alright, probably only suitable for simple scripts as the moment you organize your application/library into separate modules, you'll want/need categories instead of just level, which is not provided by Log::Minimal.

Also, only formats is customizable, there is currently no way to customize level. And the levels are "not standard" (not that there is an official authoritative standard, but the popular convention is TRACE/DEBUG/INFO/WARN/ERROR/FATAL and NONE). Log::Minimal's levels are
DEBUG/INFO/WARN/CRITICAL and NONE). Surely most people would expect another level between WARN and CRITICAL, for non-critical errors? But that is actually just a matter of taste.

Steven Haryanto - 2010-11-17T19:11:45 (permalink)

1 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Log-Fine (0.34) ***

Log::Fine is touted as a framework for those who "need a fine-grained logging mechanism in their program(s)". But apart from the emphasis on custom levels, to me there is nothing extra fine-grained about it. The other thing it provides is categories/namespace, which is also supported by a lot of other frameworks. So I fail to see the benefit/uniqueness of Log::Fine.

Btw regarding custom levels, this practice is long deprecated by log4j (and thus also by Log4perl, although Log4perl can do custom levels). I can understand this decision as I sometimes already have trouble managing the popular convention of 6 levels (FATAL/ERROR/WARN/INFO/DEBUG/TRACE) as it is, much less with custom levels!

Steven Haryanto - 2010-11-17T19:04:53 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

Config-IniFiles (2.58) ****

This module has been developed for more than a decade and seen different maintainers over the years. The codebase is indeed showing these, with different capitalization and indentation styles, among other things.

However, among more than a dozen or so of INI modules in CPAN, ironically there seems to be few other choices if you go beyond the most basic feature set. Some INI modules can only simplistically rewrite/dump the whole INI structure and thus lose comments/orders, while others can't even write INI files.

Config::IniFiles by far offers the most options and features, like dealing with line continuation, case sensitivity, default section, multiline/array, deltas, etc. So for now, despite all of its quirks, this module is still hard to beat.

There's another nice little INI module that can do read/set/delete/unset (instead of just read/dump): Prima::IniFile, but it is included in a totally unrelated distribution.

Steven Haryanto - 2010-11-12T00:42:19 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

DateTime (0.65)

Amidst all the glowing reviews may I add a reminder that, as with everything, there's a catch: runtime performance. On my PC, the speed of creating a DateTime object is just around 6000/sec. If you use DateTime intensively, it can quickly add up.

Imagine serving a web page that fetches 50 rows from database, where for convenience you convert each date column to a DateTime object, and you have 120 requests/sec coming in... That's already 6000 objects (an extra second!).

Which is unfortunate because DateTime is so wonderful, convenient, correct, complete and all that. So one approach you can use might be to delay converting to DateTime object until necessary.

Steven Haryanto - 2010-10-29T01:17:00 (permalink)

6 out of 6 found this review helpful. Was this review helpful to you?  Yes No

Date-Manip (6.14) ***

Wow, there are surely a lot of negative reviews ...

First of all, Date::Manip has a long history. I used this module back in 2001-2002, IIRC. Back then it was *the* swiss army of date/time manipulation, something you use when you want the most flexible/complete thing in Perl. True, it's slow, but it works.

But then things change. DateTime project was started, and now it is somewhat the de facto standard. It's more modern and far more modular than the monolithic Date::Manip (every timezone and language support and parsing/formatting modules shipped in one single distribution).

And then there's the 5.x -> 6.x debacle. As someone who also sprinkle Perl 5.10 requirements to his CPAN modules, I can feel for the author. But the difference is, most of my modules are not that widely used/known, and also many start its life already requiring 5.10 right from its first released version. While in Date::Manip's case, this happens to a very widely used module. Surely backwards compatibility should be considered more.

All in all, you are free to use or not use Date::Manip. There are other alternatives. Pick wisely.

Steven Haryanto - 2010-10-28T21:46:00 (permalink)

3 out of 4 found this review helpful. Was this review helpful to you?  Yes No

App-pmuninstall (0.06) *****

One would wonder why CPAN clients still don't have this crucial feature Though you see Miyagawa listed in the Credits so maybe cpanminus or its sister will end up having this functionality? One can only hope. At 0.06, some things are not working flawlessly (submitted in RT). Keep up the good work!

Steven Haryanto - 2010-10-18T04:03:44 (permalink)

1 out of 2 found this review helpful. Was this review helpful to you?  Yes No

App-lntree (0.0013) *****

I guess this app is still useful, since "cp -sR" still doesn't work as many would expect, and there are Windows users out there (yes, newer NTFS does support symlinks; though I don't know whether this module supports creating symlinks on NTFS).

A minor comment would be on the name, maybe lnstree can be considered instead (since "ln" indicates hardlink, at least for me). Btw, there's also a free software called "lns" to do the exact same thing.

Steven Haryanto - 2010-10-18T03:53:00 (permalink)

1 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Data-Clone (0.001) *****

I've never encountered difficulty in cloning data structures in Perl, usually I just use Clone or sometimes Storable's freeze + thaw (the later does not yet support cloning Regexp objects out of the box).

However, I like Data::Clone for its speed! It's several times faster than Clone or freeze+thaw. So hats up. Planning to use Data::Clone in future projects.

Now if we can convince Goro to write a fast serializer/deserializer with compact output (essentially, a faster version of Storable), that would be even nicer :-)

Steven Haryanto - 2010-09-23T03:10:21 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

Data-Pond (0.002) **

With due respect to the author, I fail to see the practical point of Pond. Pond (Perl-based open notation for data) is the Perl counterpart of JSON, except that implementation is currently only available in Perl (CMIIW), and "Pond represents fewer data types directly".

Pond is pitched against Data::Dumper + eval, which is dangerous, but Data::Dumper + eval is by far not the only method available for serialization. Perl can do Storable, JSON, YAML, even PHP serialization format.

The documentation does not show what Pond looks like.

One cute thing about Pond is that you can check Pond syntax using a single regex. But apart from that, there's nothing compelling in using Pond to serialize data.

Steven Haryanto - 2010-09-02T02:47:18 (permalink)

2 out of 2 found this review helpful. Was this review helpful to you?  Yes No

File-Which (1.09) *****

You can always count on CPAN to have prewritten modules for various things, including this one. I've never bothered before about portability and just rely on the "which" command, but for one reason there's a time when I just couldn't do that.

Btw, there's also File::Which::Cached.

Steven Haryanto - 2010-08-25T11:19:36 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No

String-ShellQuote (1.04) *****

I admit it. Ever since I know about escapeshellarg() and escapeshellcmd() in PHP, I've been reimplementing this function in Perl literally a million of times (mostly because of laziness and because it only takes a couple of lines in Perl). Only a few months ago after the millionth time I said enough is enough and started to look around in CPAN, and found this module.

The only problem for this module is lack of visibility. Before I've never read articles or blog posts mentioning this module, ever. Yes, we have system() that can bypass the shell, but qx() can't. So yes, this module needs to be marketed more!

Steven Haryanto - 2010-08-25T11:15:19 (permalink)

4 out of 4 found this review helpful. Was this review helpful to you?  Yes No

Capture-Tiny (0.08) ****

Another very handy little module that takes the hassle out of figuring the various mechanisms of capturing output.

Nice interface, great documentation, very easy to use. But....

Currently it cannot just capture stdout *ONLY* or stderr *ONLY* (while leaving the other alone). I believe this is one of the most commonly requested feature (already in RT). If that feature is implemented, this module deservers a 7-star rating.

Steven Haryanto - 2010-08-25T11:06:49 (permalink)

Was this review helpful to you?  Yes No

File-chdir (0.1004) *****

This is a handy little module, with a simple and nice interface. One of the more common bugs encountered in my scripts is forgetting to track the current working directory after doing chdir() in subroutines. By localizing $CWD, I don't have to worry that subroutines mess up current working directory anymore.

Steven Haryanto - 2010-08-25T11:04:01 (permalink)

1 out of 1 found this review helpful. Was this review helpful to you?  Yes No