Acme-CPANModules-Import-CPANRatings-User-stevenharyanto
view release on metacpan or search on metacpan
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
package Acme::CPANModules::Import::CPANRatings::User::stevenharyanto;
use strict;
our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2023-10-29'; # DATE
our $DIST = 'Acme-CPANModules-Import-CPANRatings-User-stevenharyanto'; # DIST
our $VERSION = '0.002'; # VERSION
our $LIST = {description=>"This list is generated by scraping CPANRatings (cpanratings.perl.org) user page.",entries=>[{description=>"\n(REMOVED)\n",module=>"Log::Any",rating=>undef},{description=>"\nProvides a thin/lightweight OO interface for \$?, ...
1;
# ABSTRACT: List of modules mentioned by CPANRatings user stevenharyanto
__END__
=pod
=encoding UTF-8
=head1 NAME
Acme::CPANModules::Import::CPANRatings::User::stevenharyanto - List of modules mentioned by CPANRatings user stevenharyanto
=head1 VERSION
This document describes version 0.002 of Acme::CPANModules::Import::CPANRatings::User::stevenharyanto (from Perl distribution Acme-CPANModules-Import-CPANRatings-User-stevenharyanto), released on 2023-10-29.
=head1 DESCRIPTION
This list is generated by scraping CPANRatings (cpanratings.perl.org) user page.
This list is generated by scraping CPANRatings (cpanratings.perl.org) user page.
=head1 ACME::CPANMODULES ENTRIES
=over
=item L<Log::Any>
Author: L<PREACTION|https://metacpan.org/author/PREACTION>
(REMOVED)
=item L<Process::Status>
Author: L<RJBS|https://metacpan.org/author/RJBS>
Provides a thin/lightweight OO interface for $?, much like what Time::Piece does for localtime()/gmtime() or File::Stat for stat(). Of course, Real(TM) programmers shift and fiddle bits by themselves, but for the rest of us this module is a nice conv...
=item L<Archive::Any>
Author: L<OALDERS|https://metacpan.org/author/OALDERS>
Nice idea, but the API needs to richer to be more useful (otherwise one will still need to go to individual Archive::Tar, Archive::Zip, etc). Currently the API provided are: listing files and extracting all files. We can't: create archive, add more f...
Rating: 8/10
=item L<Devel::Confess>
Author: L<HAARG|https://metacpan.org/author/HAARG>
Very nifty, it's like Carp::Always but with much more options/features (so you don't need a separate Carp::Always::Color, Carp::Always::Dump, and so on).
=item L<SQL::Statement>
Author: L<REHSACK|https://metacpan.org/author/REHSACK>
The concept is truly cool, unfortunately the parser is currently flaky/buggy: one SQL query might work but another valid and seemingly simple SQL would fail with weird error message. See distribution's RT queue.
<br>
Rating: 6/10
=item L<PerlMongers::Hannover>
Author: L<PTC|https://metacpan.org/author/PTC>
Instead of just printing some info, why not make it an Acme::PM or Acme::PerlMongers like Acme::CPANAuthors? Various stats can then be produced about the various Perl Mongers.
<br>
=item L<App::multiwhich>
Note that File::Which can also search for all matches too if you use it in a list context, e.g. @paths = which('foo'). File::Which also comes with a pwhich CLI utility which also accepts multiple arguments and has the -a switch to print all matches. ...
<br><br>In fact, the Unix 'which' command (or at least its Debian variant) also sports the -a switch.
=item L<Object::Anon>
Author: L<ROBN|https://metacpan.org/author/ROBN>
Nice idea. Some notes: 1) to be widely used, it really needs to be very efficient; 2) if the goal is simply to objectify a hash, perhaps Hash::Objectify or Object::From::Hash or Hash::To::Object (or Data::Objectify and so on) is a more descriptive na...
<br>
=item L<Data::Seek>
The "extremely fast and efficient" claim currently doesn't hold, as this module creates a I<whole> flattened tree for I<every> search operation.
<br><br>A simple benchmark:
<br><br>###
<br>
use Benchmark qw(timethese);
<br>
use Data::Seek;
<br>
use Data::DPath qw(dpath);
<br>
use JSON::Path;
<br><br>my $data = { map { $_ => {map {$I<< =>[1..4]} 1..20} } "a".."z" };
<br><br>timethese(-0.25, {
<br><br>dseek => sub { $ds = Data::Seek->new(data=>$data); $ds->search("j.1.\@")->data },
<br><br>dseek >>cacheobj=>sub{ state $ds=Data::Seek->new(data=>$data); $ds->search("j.1.\@")->data },
<br><br>dpath=>sub{ dpath("/j/1/I<< ")->match($data) },
<br><br>jpath=>sub{ JSON::Path->new(q[$.j.1.[ >>]])->values($data) },
<br>
});
<br>
=head2 #
<br><br>###
<br>
Benchmark: running dpath, dseek, dseek_cacheobj, jpath for at least 0.25 CPU seconds...
<br><br>dpath: 1 wallclock secs ( 0.27 usr + 0.00 sys = 0.27 CPU) @ 8292.59/s (n=2239)
<br><br>(warning: too few iterations for a reliable count)
<br><br>dseek: 1 wallclock secs ( 0.29 usr + 0.00 sys = 0.29 CPU) @ 37.93/s (n=11)
<br><br>(warning: too few iterations for a reliable count)
<br>
dseek_cacheobj: 0 wallclock secs ( 0.33 usr + 0.00 sys = 0.33 CPU) @ 42.42/s (n=14)
<br><br>(warning: too few iterations for a reliable count)
<br><br>jpath: 0 wallclock secs ( 0.27 usr + 0.00 sys = 0.27 CPU) @ 11711.11/s (n=3162)
<br><br>(warning: too few iterations for a reliable count)
<br>
=head2 #
<br><br>Also: 1) the syntax is rather inconsistent: ':n' for array index access, but '.@' (instead of ':@') for grabbing all elements. 2) currently cannot select subtree (must always select leaf node).
<br><br>As alternatives, I recommend the much simpler JSON::Path, or the more powerful Data::DPath.
<br>
=item L<Games::2048>
Author: L<BLAIZER|https://metacpan.org/author/BLAIZER>
My favorite 2048 implementation (it's text-mode, written in Perl, uses my module Color::ANSI::Util, and what else... oh yeah, it's the only implementation where I've reached 2048 :-) ).
<br><br>One tip: enlarge the fonts of your terminal emulator (e.g. Ctrl-+ on Konsole) until it's big and convenient enough.
=item L<App::D>
Author: L<BESSARABV|https://metacpan.org/author/BESSARABV>
As an alternative, one can also do:
<br><br>alias d='
<br><br>TZ=UTC date; # show date in UTC
<br><br>date ; # show date in local timezone
<br><br>cal -3 ; # show monthly calendar for curmon-1, curmon, curmon+1
<br>
'
<br><br>
=item L<Getopt::Long>
Author: L<JV|https://metacpan.org/author/JV>
Having worked for quite some time with option processing and several other similar modules, I have to say that most of the time you probably want to use Getopt::Long instead of the other alternatives. Or at least pick the alternatives which are based...
<br><br>Most other modules that reinvent option parsing either don't bother to do short option bundling (-abc instead of -a -b -c), or abbreviation (--long-o instead --long-option-name), or the choice to (dis)allow mix-mashing options and arguments, ...
<br>
=item L<Text::Table::Tiny>
Author: L<NEILB|https://metacpan.org/author/NEILB>
Very fast, several times faster than Text::TabularDisplay or Text::Table (and many times faster than the other slower table-generator modules). It uses sprintf() to format a whole row instead of formatting each cell separately using sprintf() and joi...
<br><br>I did a comparison in: <a href="http://blogs.perl.org/users/steven_haryanto/2014/07/benchmarking-several-ascii-table-generator-modules.html" rel="nofollow">blogs.perl.org/users/steven_haryanto/...</a>
=item L<Mo>
Author: L<TINITA|https://metacpan.org/author/TINITA>
A great alternative when Moo is a bit too much for you. Useful for scripts that must start really fast. Mind you, Moo loads about 5K lines of code and more than a dozen files, all of which takes +- 10ms on my computer. Mo on the other hand is only a ...
<br><br>I use this for a very lightweight parent class. A richer subclass then uses Moo.
<br><br>Isn't it great that we have the choices and upgrade path from the very minimal Mo, to Moo for normal cases, to Moos and Moose for even richer (but heavier) alternatives. Truly TIMTOWTDI!
<br>
=item L<App::ChangeShebang>
Author: L<SKAJI|https://metacpan.org/author/SKAJI>
Given that the name of this module/app is "change shebang" (instead of "change shebang to samedir perl") perhaps this app can be made more generic? For example, I've had to change all shebangs from "#!/usr/bin/env perl" ...
<br>
=item L<Hash::Ordered>
Author: L<DAGOLDEN|https://metacpan.org/author/DAGOLDEN>
Overall looks ok, with the exception that it does not look and feel like a regular Perl hash at all. Now someone just needs to create a tie interface on top of this :)
<br>
=item L<App::whatthecommit>
Author: L<MUDLER|https://metacpan.org/author/MUDLER>
From the description: "App::whatthecommit is just another lazy-to-lazy line command utility." I'd thought the definition of laziness would be something like 'alias gc=git commit --allow-empty-message'. This is more like hubris. Or whatever....
<br>
=item L<Opt::Imistic>
Author: L<ALTREUS|https://metacpan.org/author/ALTREUS>
Very nifty for short scripts and some clever design inside (all options are stored as arrayref, but there is some overloading to make getting boolean/flag and normal scalar value convenient).
<br><br>For more "proper" scripts though (anything above say 20-30 lines) I'd recommend using something like Getopt::Long with a real spec. Some of the features I like in G::L not in Opt::Imistic: the ability to get --noOPT for free for fla...
=item L<Devel::STrace>
Author: L<DARNOLD|https://metacpan.org/author/DARNOLD>
The doc looks promising, it really looks like it could be the "strace for Perl functions", but the usage is awkward (you have to open two terminals, one for running your program and producing trace file, and another for reading this file). ...
<br><br>One alternative if you're looking for a similar module is Debug::LTrace.
<br><br>
=item L<Devel::TraceSubs>
Author: L<PARTICLE|https://metacpan.org/author/PARTICLE>
For an alternative, try Debug::LTrace, which roughly provides the same basic feature but is more convenient to use from the command-line and give extra information like timing.
<br><br>
=item L<Devel::TraceCalls>
Author: L<COSIMO|https://metacpan.org/author/COSIMO>
Might be powerful and flexible, but not convenient to use especially from command-line. (I was searching for something like "strace for Perl function").
<br>
=item L<Debug::LTrace>
Author: L<KOORCHIK|https://metacpan.org/author/KOORCHIK>
One of the more convenient and usable subroutine tracing modules on CPAN. If you're looking for something like "strace for Perl functions", try this.
<br>
=item L<Debug::Trace>
Author: L<JV|https://metacpan.org/author/JV>
Good module, but try its derivative Debug::LTrace instead. Debug::Trace doesn't fake caller() yet so traced/wrapped subroutines get caller() results that are "off-by-1" (see Hook::LexWrap). Plus, Debug::LTrace gives more information like ti...
<br><br>
=item L<App::Trace>
Author: L<SPADKINS|https://metacpan.org/author/SPADKINS>
The name and abstract is slightly inaccurate/misleading. This module is supposed to be a general logging framework instead of just subroutine entry/exit tracer. For alternative subroutine tracer, I'd recommend Devel::TraceSubs or Devel::TraceCalls (o...
<br><br>Not very convenient to use. It still requires you to put 'if $App::Trace' clause everytime. For general logging that can be switched on/off upon runtime, I'd recommend using Log::Any instead.
<br><br>Lastly, this module is tied to App::Options and thus only really usable if you use both.
=item L<Tie::Hash::Identity>
Author: L<CINDY|https://metacpan.org/author/CINDY>
Hash::Identity has a use case of convenience when embedding expression in double-quote strings. I fail to see the point of Tie::Hash::Identity though. Can't you just say:
<br><br>'abc' eq 'abc'; # true
<br><br>(1+2+3) eq '6'; # true
<br>
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
<br><br>use File::Umask; # or whatever, the "Local" thing is redundant
<br>
{
<br><br>local $UMASK = 0077;
<br><br>open(...);
<br><br>copy(...);
<br>
}
<br>
=head1 previous umask is restored
<br><br>which is arguably better (to me at least) than the current:
<br><br>use Umask::Local;
<br>
{
<br><br>my $umask_local = Umask::Local->new(0077);
<br><br>open(...);
<br><br>copy(...);
<br>
}
<br>
=head1 previous umask is restored
<br>
=item L<Proc::PidUtil>
Author: L<MIKER|https://metacpan.org/author/MIKER>
No file locking is currently done to the PID file to avoid race condition. Look at Proc::PID::File for a more proper implementation.
<br><br>
=item L<Data::Dumper::Sorted>
Author: L<MIKER|https://metacpan.org/author/MIKER>
Unnecessary. Data::Dumper does have the option to sort hash keys ($Sortkeys, look for 'sort' in 'perldoc Data::Dumper').
<br><br>This module also does not handle circular refs yet (and probably lacks other features of Data::Dumper too).
<br><br>Also the choice of returning error ("$Var00 = not a reference" when given Dumper(1) for example) as result is arguably unwise.
<br>
=item L<Archive::Probe>
Author: L<FGZ|https://metacpan.org/author/FGZ>
I would personally pick a non-OO, no-nonsense interface based on File::Find, like:
<br><br>use File::Find::Archive qw(find); # or find_archive
<br>
find(sub { ... }, "some.tar.gz");
<br><br>instead of the multiline, tedious setup just to search a file.
<br>
=item L<App::DBBrowser>
Author: L<KUERBIS|https://metacpan.org/author/KUERBIS>
A nice, minimalistic, terminal-based user interface for browsing your database and tables. Might be useful for simple cases.
<br><br>It would be I<much> more useful if usernames/passwords, queries, and other settings can be saved in a config/session file.
<br>
=item L<Locale::Maketext>
Author: L<TODDR|https://metacpan.org/author/TODDR>
Users might want to check out this article on why one should perhaps use Locale::TextDomain instead of Locale::Maketext: <a href="http://www.perladvent.org/2013/2013-12-09.html" rel="nofollow">www.perladvent.org/2013/2013-12-09.html</a>
=item L<Curses::Toolkit>
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.
<br><br>See also: <a href="http://www.perlmonks.org/?node_id=1059926" rel="nofollow">www.perlmonks.org/?node_id=1059926</a>
<br><br>As I explore doing TUI more, I will update the reviews.
<br>
=item L<Moo::Lax>
Author: L<DAMS|https://metacpan.org/author/DAMS>
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.
<br>
=item L<App::YTDL>
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...
<br>
=item L<Data::CompactDump>
Author: L<MILSO|https://metacpan.org/author/MILSO>
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.
<br><br>Currently also contains some bugs like for -1 (changes it to string), "\" (produces invalid dump, does not handle backslash yet currently),
<br><br>And Data::Dump's dump of {} and [] are currently more compact ;-)
<br><br>Need to be improved significantly first. But keep up the effort.
=item L<P>
Author: L<LAWALSH|https://metacpan.org/author/LAWALSH>
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.
<br><br>Having said that, I would like to comment on the design and implementation of this module.
<br><br>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 (...
<br><br>2) P loads utf8 by default. For ultra-lightweight cases, this is sometimes not desirable. There is currently no way to turn this off.
<br><br>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.
<br><br>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.
<br><br>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).
=item L<Xporter>
Author: L<LAWALSH|https://metacpan.org/author/LAWALSH>
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
=item L<Module::Quote>
Author: L<TOBYINK|https://metacpan.org/author/TOBYINK>
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)?
<br>
=item L<Module::Hash>
Author: L<TOBYINK|https://metacpan.org/author/TOBYINK>
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)?
=item L<Promises>
Author: L<YANICK|https://metacpan.org/author/YANICK>
5-star for its documentation.
<br>
=item L<Lingua::ITA::Numbers>
Author: L<PETAMEM|https://metacpan.org/author/PETAMEM>
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...
<br><br>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...
=item L<HTTP::Headers::Patch::DontUseStorable>
Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>
@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.
<br>
=item L<Storable>
Author: L<NWCLARK|https://metacpan.org/author/NWCLARK>
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.
<br><br>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?
Rating: 2/10
=item L<WWW::YouTube::Download>
Author: L<OALDERS|https://metacpan.org/author/OALDERS>
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 mod...
=item L<Number::Zero>
From the module's POD: "The number zero and undef are difficult to determine in Perl."
<br><br>Are they?
<br><br>say !defined($data) ? "undef" : "not undef";
<br><br>say defined($data) && $data==0 ? "zero" : "not zero"; # yes, warn if non-numeric
<br><br>use Scalar::Util 'looks_like_number';
<br>
say looks_like_number($data) && $data==0 ? "zero" : "not zero";
<br><br>Though I understand the need for a convenient "is_zero" function if you need to test for zero in a program a lot.
=item L<Syntax::SourceHighlight>
Author: L<MATLIB|https://metacpan.org/author/MATLIB>
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.
<br>
Rating: 8/10
=item L<Syntax::Highlight::Engine::Kate>
Author: L<MANWAR|https://metacpan.org/author/MANWAR>
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 1...
<br><br>
Rating: 2/10
=item L<Syntax::Highlight::JSON>
Author: L<MART|https://metacpan.org/author/MART>
No documentation. Combines formatting and syntax-highlighting, so you cannot preserve original formatting. Only outputs to HTML and no default "theme" (CSS) provided.
<br>
Rating: 2/10
=item L<Syntax::Highlight::Engine::Simple>
Author: L<AKHUETTEL|https://metacpan.org/author/AKHUETTEL>
Output looks decent. However, it currently only formats to HTML/CSS (no ANSI, LaTeX, etc). Also, it needs more languages support.
<br>
Rating: 6/10
=item L<Syntax::Highlight::Universal>
Author: L<PALANT|https://metacpan.org/author/PALANT>
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).
Rating: 2/10
=item L<text::highlight>
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.
Rating: 2/10
=item L<SemVer>
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
Have failed to build for 1.5 years (reported bug RT#66958 left untouched, users need to install Module::Install first). No usage documentation.
<br><br>
Rating: 2/10
=item L<perlsecret>
Author: L<BOOK|https://metacpan.org/author/BOOK>
Nice collection of perl shortcuts. Today I forgot about the name for "x!!" and nicely found it in this module.
=item L<PerlX::ArraySkip>
Author: L<TOBYINK|https://metacpan.org/author/TOBYINK>
Cute idea as always, though I'd rather use comments rather than taking multiple sub calls hit.
=item L<App::perlfind>
Author: L<MARCEL|https://metacpan.org/author/MARCEL>
A timesaver. Using it on a daily basis (aliased to "pod"). Thanks, Marcel!
=item L<PerlX::Maybe>
Author: L<TOBYINK|https://metacpan.org/author/TOBYINK>
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).
<br><br>
=item L<File::Path::Tiny>
Author: L<DMUEY|https://metacpan.org/author/DMUEY>
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.
<br>
Rating: 6/10
=item L<Exporter::Lite>
Author: L<NEILB|https://metacpan.org/author/NEILB>
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.
<br><br>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:
<br><br>use Exporter qw(import);
<br>
=item L<YAML::Syck>
Author: L<TODDR|https://metacpan.org/author/TODDR>
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.
=item L<Devel::FindPerl>
Author: L<LEONT|https://metacpan.org/author/LEONT>
IMO the module should explain in the POD, in what cases using $^X is not enough or how it is different from Probe::Perl.
<br><br>Anyway, quoting CPAN Testers' CPAN Authors FAQ, $^X is not enough when:
<br>
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...
=item L<Taint::Util>
Author: L<AVAR|https://metacpan.org/author/AVAR>
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 ...
=item L<Markdown::Pod>
Author: L<KEEDI|https://metacpan.org/author/KEEDI>
I use Markdown::Pod for my module Perinci::To::POD.
<br><br>This module does not output proper POD for many (not so) edge cases, like:
<br><br>C<>> and the likes are not yet escaped, producing C<>> when it should have been C<< > >> or C<E<gt>>.
<br><br>Ordered list numbering does not yet work, e.g. "2. ...\n3. ...\n" produces "=item 1. ... =item 1. ..."
<br><br>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.
<br><br>Inline markup is not smart enough to differentiate word_with_underscore. So "foo_bar and foo_baz" becomes "fooI<bar and foo>baz".
<br><br>Plus it segfaults sometimes (might be my perl though).
Rating: 4/10
=item L<Lingua::Metadata>
Author: L<MAJLIS|https://metacpan.org/author/MAJLIS>
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.
<br>
=item L<Finance::Currency::Convert::WebserviceX>
Author: L<CLACO|https://metacpan.org/author/CLACO>
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.
<br>
=item L<Carp::Always::Color>
Author: L<DOY|https://metacpan.org/author/DOY>
Like Carp::Always? Want something better? Here it is.
<br>
=item L<CHI>
Author: L<ASB|https://metacpan.org/author/ASB>
The DBI of caching. Stop reinventing your caching framework and just use this.
<br><br>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 ...
<br>
Rating: 8/10
=item L<Monkey::Patch>
Author: L<FRODWITH|https://metacpan.org/author/FRODWITH>
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 ...
<br><br>
=item L<Log::AutoDump>
Author: L<CAGAO|https://metacpan.org/author/CAGAO>
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).
<br><br>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.
<br><br>
=item L<List::Pairwise>
Author: L<TDRUGEON|https://metacpan.org/author/TDRUGEON>
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'?
=item L<Log::Log4perl::Appender::File::FixedSize>
Author: L<HOREA|https://metacpan.org/author/HOREA>
Module name should perhaps be Log::Log4perl::Appender::File::RoundRobin to make it clearer that the backend is File::RoundRobin.
<br>
=item L<Any::Mo>
Why exclude Moo?
<br><br>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 Mous...
<br>
=item L<PerlX::Perform>
Author: L<TOBYINK|https://metacpan.org/author/TOBYINK>
I personally don't see much value of this syntactic sugar since Perl already allows us to express clearly. Pick one:
<br><br>for ($foo) { say $_ if defined }
<br><br>for (grep {defined} $foo) { say $_ }
<br><br>do { say $_ if defined } for $foo
<br><br>say $_ for grep {defined} $foo
<br><br>And save yourself from having to remember whether we should add a comma or not before "wherever".
<br>
=item L<TOBYINK::PerlX::A>
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).
=item L<WWW::Google::Images>
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 O...
=item L<Acme::Damn>
Author: L<IBB|https://metacpan.org/author/IBB>
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.
<br><br>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.
<br><br>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 Win...
<br>
=item L<WWW::Parallels::Agent>
@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.
<br>
=item L<Underscore>
I don't know why Sawyer X's review is marked as unhelpful (2 out of 8), but I agree with him. This is I<not> an Acme module, it's a port of a JavaScript library of the same name.
<br>
=item L<Locale::Geocode>
Author: L<DIZ|https://metacpan.org/author/DIZ>
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.
<br><br>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 do...
<br><br>Sadly we live in a world where countries and subcountries change all the time.
Rating: 2/10
=item L<Locale::SubCountry>
Author: L<KIMRYAN|https://metacpan.org/author/KIMRYAN>
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.
<br><br>2012-02-17: Review to version 1.47:
<br><br>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.
<br><br>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 province...
<br><br>Sadly we live in a world where countries and subcountries change all the time.
<br><br>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.
<br>
Rating: 8/10
=item L<Data::Rmap>
Author: L<BOWMANBS|https://metacpan.org/author/BOWMANBS>
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 t...
<br><br>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 ob...
<br>
=item L<Data::Properties::JSON>
Author: L<JOHND|https://metacpan.org/author/JOHND>
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)?
<br><br>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 {JSO...
=item L<Exporter::Auto>
Author: L<NEILB|https://metacpan.org/author/NEILB>
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 h...
<br><br>Let me remind all again by quoting from Exporter's POD: "Do I<not> export anything else by default without a good reason! Exports pollute the namespace of the module user."
=item L<Net::Douban>
Interface to web services should be put under WWW::I<, not Net::>
=item L<HTML::Form::XSS>
Author: L<DUMB|https://metacpan.org/author/DUMB>
Should probably be put under Test::*?
=item L<Thread::IID>
Author: L<WROG|https://metacpan.org/author/WROG>
When I saw the perlmonks thread yesterday, I thought "well, someone should package it and put it on CPAN". And then someone did :) Thanks.
<br>
=item L<Test::Lite>
Author: L<BRADH|https://metacpan.org/author/BRADH>
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 rei...
=item L<Sub::Mage>
Author: L<BRADH|https://metacpan.org/author/BRADH>
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 v...
<br><br>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.
<br>
=item L<relative_lib>
Documentation is placed in README.md, so it's inaccessible from perldoc et al. Why? This is not a Python library.
=item L<CPAN::Mini::Webserver>
Author: L<MITHALDU|https://metacpan.org/author/MITHALDU>
Just found out about it, despite having used CPAN::Mini for over a year. Helps I<a lot>. More people should know this (e.g. mention from CPAN::Mini POD).
=item L<Win32::App::which>
Author: L<DOLMEN|https://metacpan.org/author/DOLMEN>
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).
<br><br>At least the documentation should state why this module is necessary. It complicates scripts by having to select between two 'which' implementations.
=item L<Devel::Platform::Info>
Author: L<BARBIE|https://metacpan.org/author/BARBIE>
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.
<br><br>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.
<br><br>This module is so new though (started in 2010) so I wonder whether this need has never come up before.
<br>
=item L<Package::Builder>
Author: L<DRAUONER|https://metacpan.org/author/DRAUONER>
Less boilerplate please!
Rating: 2/10
=item L<File::LibMagic>
Author: L<DROLSKY|https://metacpan.org/author/DROLSKY>
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).
<br><br>For those stuck without a C compiler, File::Type or File::Magic can be an alternative.
Rating: 8/10
=item L<File::MMagic::XS>
Author: L<DMAKI|https://metacpan.org/author/DMAKI>
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).
<br><br>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).
Rating: 4/10
=item L<File::MMagic>
Author: L<KNOK|https://metacpan.org/author/KNOK>
Works for basic usage, but has quite a few problems. Plus it is not very performant. Doesn't seem to be maintained anymore.
<br><br>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...
<br>
Rating: 4/10
=item L<File::Type>
Author: L<PMISON|https://metacpan.org/author/PMISON>
As another reviewer has said, this module tends to conclude "application/octet-stream" for many kinds of files, making it not very useful.
<br><br>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 failu...
<br>
Rating: 2/10
=item L<Time::Mock>
Author: L<EWILHELM|https://metacpan.org/author/EWILHELM>
Balancing previous 1 rating by @Ingo.
<br><br>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?
<br><br>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.
=item L<Sakai::Stats>
Release early, release often indeed. First you release nothing but boilerplate :)
Rating: 2/10
=item L<Spreadsheet::Perl>
Author: L<NKH|https://metacpan.org/author/NKH>
Good documentation. All modules' documentation should similarly strive to contain at least: rationale for existence, pointer to alternatives, and task-oriented organization.
=item L<Unix::PasswdFileOps>
Author: L<BMAYNARD|https://metacpan.org/author/BMAYNARD>
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.
<br>
Rating: 4/10
=item L<Array::Diff>
Author: L<NEILB|https://metacpan.org/author/NEILB>
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'...
<br>
=item L<DZ1>
Why do we need this uploaded to CPAN?
Rating: 2/10
=item L<Passwd::Unix>
Author: L<STRZELEC|https://metacpan.org/author/STRZELEC>
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).
<br><br>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?
<br><br>Between this and Unix::ConfigFile, I'm seriously considering using Unix commands instead (useradd, userdel, gpasswd, et al).
<br><br>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.
<br><br>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.
Rating: 2/10
=item L<Unix::ConfigFile>
Author: L<SSNODGRA|https://metacpan.org/author/SSNODGRA>
Outdated module that doesn't handle /etc/shadow and /etc/gshadow.
Rating: 2/10
=item L<lib::xi>
Author: L<GFUJI|https://metacpan.org/author/GFUJI>
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.
<br>
=item L<Capture::Tiny::Extended>
Author: L<MITHALDU|https://metacpan.org/author/MITHALDU>
Indispensable. Provides nice enhancement to Capture::Tiny (particularly the real-time teeing).
<br>
=item L<google_talk_bot>
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.
<br>
Rating: 2/10
=item L<Clone::Any>
Author: L<EVO|https://metacpan.org/author/EVO>
Using Clone::Any nowadays is more trouble than it's worth.
<br><br>First, there are annoying incompatibilities between cloning modules. Most notably Storable, which is the default cloning module if Clone is not available, I<still> doesn't support storing Regexp objects out-of-the-box after all these years.
<br><br>Second, this module has not been updated for a long time and newer alternatives like the fast Data::Clone is not recognized.
<br><br>Right now I'm replacing all code from using Clone::Any code to Data::Clone.
<br><br>
Rating: 4/10
=item L<Array::OrdHash>
Author: L<WOWASURIN|https://metacpan.org/author/WOWASURIN>
Fun module to play with, especially for those among us infected with a bit of PHP envy (me, never!).
<br>
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
Author: L<BLOONIX|https://metacpan.org/author/BLOONIX>
This review mostly compares Log::Handler with Log4perl, which is a mature and one of the most popular logging frameworks.
<br><br>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.
<br><br>There is a unique concept of maxlevel not normally found in other frameworks, though it can be emulated in other frameworks using filters.
<br><br>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).
<br><br>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 ...
Rating: 8/10
=item L<Log::Fast>
Author: L<POWERMAN|https://metacpan.org/author/POWERMAN>
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...
<br><br>So this module will certainly come handy if you have a performance critical application.
<br><br>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 log...
=item L<Log::Minimal>
Author: L<KAZEBURO|https://metacpan.org/author/KAZEBURO>
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 leve...
<br><br>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/FAT...
<br>
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.
<br>
Rating: 4/10
=item L<Log::Fine>
Author: L<CFUHRMAN|https://metacpan.org/author/CFUHRMAN>
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 c...
<br><br>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 ...
Rating: 6/10
=item L<Config::IniFiles>
Author: L<SHLOMIF|https://metacpan.org/author/SHLOMIF>
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.
<br><br>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 ...
<br><br>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.
<br><br>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.
Rating: 8/10
=item L<DateTime>
Author: L<DROLSKY|https://metacpan.org/author/DROLSKY>
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.
<br><br>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!).
<br><br>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.
=item L<Date::Manip>
Author: L<SBECK|https://metacpan.org/author/SBECK>
Wow, there are surely a lot of negative reviews ...
<br><br>First of all, Date::Manip has a long history. I used this module back in 2001-2002, IIRC. Back then it was I<the> swiss army of date/time manipulation, something you use when you want the most flexible/complete thing in Perl. True, it's slow,...
<br><br>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 ship...
<br><br>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 ...
<br><br>All in all, you are free to use or not use Date::Manip. There are other alternatives. Pick wisely.
<br>
Rating: 6/10
=item L<App::pmuninstall>
Author: L<XAICRON|https://metacpan.org/author/XAICRON>
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 flaw...
<br><br>
=item L<App::lntree>
Author: L<ROKR|https://metacpan.org/author/ROKR>
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 NT...
<br><br>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.
<br><br>
=item L<Data::Clone>
Author: L<GFUJI|https://metacpan.org/author/GFUJI>
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).
<br><br>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.
<br><br>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 :-)
<br><br>
=item L<Data::Pond>
Author: L<ZEFRAM|https://metacpan.org/author/ZEFRAM>
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 few...
<br><br>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.
<br><br>The documentation does not show what Pond looks like.
<br><br>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.
Rating: 4/10
=item L<File::Which>
Author: L<PLICEASE|https://metacpan.org/author/PLICEASE>
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 tha...
<br><br>Btw, there's also File::Which::Cached.
=item L<String::ShellQuote>
Author: L<ROSCH|https://metacpan.org/author/ROSCH>
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 fe...
<br><br>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...
<br>
=item L<Capture::Tiny>
Author: L<DAGOLDEN|https://metacpan.org/author/DAGOLDEN>
Another very handy little module that takes the hassle out of figuring the various mechanisms of capturing output.
<br><br>Nice interface, great documentation, very easy to use. But....
<br><br>Currently it cannot just capture stdout I<ONLY> or stderr I<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 ra...
Rating: 8/10
=item L<File::chdir>
Author: L<DAGOLDEN|https://metacpan.org/author/DAGOLDEN>
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 ...
=back
=head1 FAQ
=head2 What is an Acme::CPANModules::* module?
An Acme::CPANModules::* module, like this module, contains just a list of module
names that share a common characteristics. It is a way to categorize modules and
document CPAN. See L<Acme::CPANModules> for more details.
=head2 What are ways to use this Acme::CPANModules module?
Aside from reading this Acme::CPANModules module's POD documentation, you can
install all the listed modules (entries) using L<cpanm-cpanmodules> script (from
L<App::cpanm::cpanmodules> distribution):
% cpanm-cpanmodules -n Import::CPANRatings::User::stevenharyanto
Alternatively you can use the L<cpanmodules> CLI (from L<App::cpanmodules>
distribution):
( run in 1.135 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )