view release on metacpan or search on metacpan
Text::Table::Tiny
Author: 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
joining cells together with join(). <br><br>I did a comparison in:
<a
href="http://blogs.perl.org/users/steven_haryanto/2014/07/benchmarki
ng-several-ascii-table-generator-modules.html"
rel="nofollow">blogs.perl.org/users/steven_haryanto/...</a>
Mo Author: 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 single line of
+-500 characters, and it's inlinable. It loads in under 1ms. If a
script must be executed thousands of times a day, that 9ms
difference will matter more. <br><br>I use this for a very
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
timing. <br><br>
App::Trace
Author: 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 (or even
Devel::Trace + variants). <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.
Tie::Hash::Identity
Author: 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>
Fsdb
Author: JOHNH <https://metacpan.org/author/JOHNH>
An interesting tool that has been developed since 1991 (which is
roughly around the time the WWW and Linux was born, whew). Kudos to
the author for the dedication and consistency. <br><br>Since
nowadays SQL is pretty much ubiquitous, users might also want to
check out an alternative tool, App::fsql. For example (taking a
similar example from the module's doc), to select entries in
/etc/passwd where UID is between 1000 and 2000: <br><br>$ ( echo -e
"login\tpassword\tuid\tgid\tgecos\thome\tshell"; sed
's/:/\t/g' /etc/passwd ) | fsql --add-tsv - 'SELECT * FROM stdin
WHERE uid >= 1000 AND uid <= 2000' --format text --aoh
Date::Tie
Author: FGLOCK <https://metacpan.org/author/FGLOCK>
Cool, but personally I'd rather have something like JavaScript's
properties (since Perl does have lvalue subroutine support):
<br><br>$date->year = 2014; <br>
Text::VisualWidth::PP
Author: TOKUHIROM <https://metacpan.org/author/TOKUHIROM>
Also look at Text::CharWidth for an alternative that can be used
with text in other languages (Chinese, etc). <br>
Taint::Runtime
Author: RHANDOM <https://metacpan.org/author/RHANDOM>
Nice idea. Perl should really have included something like this
(analogous to warnings.pm for -w). <br><br>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. <br><br>* First,
user must remember to import $TAINT, or doing '$TAINT = 1' has no
effect. There's no error/warning for this mistake. <br><br>* 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.
<br><br>* One must remember to 'taint_env' *after* 'taint_start'.
There's no warning/error if one does the opposite. <br><br>I'd
Author: LORN <https://metacpan.org/author/LORN>
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. <br><br>
LWP::Protocol::Net::Curl
Author: SYP <https://metacpan.org/author/SYP>
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. <br>
Devel::SizeMe
Author: TIMB <https://metacpan.org/author/TIMB>
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.
Oktest
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.
<br><br>
Log::AutoDump
Author: 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>
List::Pairwise
Author: 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'?
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.
<br><br>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?
Rating: 6/10
autodie
Author: TODDR <https://metacpan.org/author/TODDR>
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.
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.
Rating: 2/10
Log::Log4perl
Author: ETJ <https://metacpan.org/author/ETJ>
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. <br><br>One of the main strengths of Log4perl is its
sublogger/subcategory feature, which few other frameworks seem to
have. <br><br>For other alternatives, also take a look at:
Log::Handler, Log::Any. And of course Log::Message too. <br>
Log::Handler
Author: 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
because I would otherwise switch.
Rating: 8/10
Log::Fast
Author: 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
mention a comparison to Log::Log4perl, but a casual benchmark shows
that it's at least 10x faster. <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 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.
Log::Minimal
Author: 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 level, which is not
provided by Log::Minimal. <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/FATAL and NONE). Log::Minimal's levels
are <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
Log::Fine
Author: 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
categories/namespace, which is also supported by a lot of other
frameworks. So I fail to see the benefit/uniqueness of Log::Fine.
<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 6 levels
(FATAL/ERROR/WARN/INFO/DEBUG/TRACE) as it is, much less with custom
levels!
Rating: 6/10
Config::IniFiles
Author: SHLOMIF <https://metacpan.org/author/SHLOMIF>
String::ShellQuote
Author: 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 few months
ago after the millionth time I said enough is enough and started to
look around in CPAN, and found this module. <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>
Capture::Tiny
Author: 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 *ONLY* or stderr
devdata/stevenharyanto view on Meta::CPAN
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<img src="//cdn.perl.org/perlweb/images/logo_cpanratings.svg" alt="Reviews by Steven Haryanto | Perl, modern programming" class="page-logo">
</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="list-inline text-center nav navbar-nav navbar-right">
<li class="sub">
<a href="/search">Search</a>
</li>
<li class="sub">
<a href="/about.html">About</a>
</li>
<li class="sub">
<a href="https://log.perl.org/2018/06/cpan-ratings-read-only.html">
<b>Read-Only</b>
</a>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-5.0.png" alt="*****">
</h3>
<blockquote class="review_text">
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...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2014-07-10T20:49:10
(<a href="/dist/Text-Table-Tiny#11826">permalink</a>)
</p>
<div class="helpfulq">
devdata/stevenharyanto view on Meta::CPAN
(<a href="https://metacpan.org/release/App-Trace/">0.50</a>)
</h3>
<blockquote class="review_text">
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...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2014-06-21T19:11:34
(<a href="/dist/App-Trace#11800">permalink</a>)
</p>
<div class="helpfulq">
devdata/stevenharyanto view on Meta::CPAN
(<a href="https://metacpan.org/release/Fsdb/">2.50</a>)
</h3>
<blockquote class="review_text">
An interesting tool that has been developed since 1991 (which is roughly around the time the WWW and Linux was born, whew). Kudos to the author for the dedication and consistency.
<br><br>Since nowadays SQL is pretty much ubiquitous, users might also...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2014-05-27T23:08:36
(<a href="/dist/Fsdb#11762">permalink</a>)
</p>
<div class="helpfulq">
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-4.0.png" alt="****">
</h3>
<blockquote class="review_text">
Nice idea. Perl should really have included something like this (analogous to warnings.pm for -w).
<br><br>However, for something as security-related as tainting, I personally think the interface is a bit too complex and not robust enough. There are ...
}
<br><br>use tainting;
<br>
{
<br><br>no tainting;
<br><br>... code is running without taint mode ...
<br>
}
<br><br>No functions, no variables to set, no exports. Tainting of %ENV etc should be done automatically just like -T.
<br><br>EDIT: I wrote tainting and uploaded it to CPAN as proof of concept.
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2012-12-28T00:11:34
(<a href="/dist/Taint-Runtime#10699">permalink</a>)
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-5.0.png" alt="*****">
</h3>
<blockquote class="review_text">
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.
<br>
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2012-10-24T16:28:12
(<a href="/dist/LWP-Protocol-Net-Curl#10458">permalink</a>)
</p>
devdata/stevenharyanto view on Meta::CPAN
(<a href="https://metacpan.org/release/Log-AutoDump/">0.05</a>)
</h3>
<blockquote class="review_text">
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 ...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2012-04-24T05:15:25
(<a href="/dist/Log-AutoDump#9830">permalink</a>)
</p>
<div class="helpfulq">
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-3.0.png" alt="***">
</h3>
<blockquote class="review_text">
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.
<br><br>If it's still working for you, great. I pers...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2010-11-24T09:08:27
(<a href="/dist/Mail-Sendmail#7882">permalink</a>)
</p>
<div class="helpfulq">
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-5.0.png" alt="*****">
</h3>
<blockquote class="review_text">
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...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2010-11-18T16:14:42
(<a href="/dist/Log-Log4perl#7852">permalink</a>)
</p>
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-4.0.png" alt="****">
</h3>
<blockquote class="review_text">
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...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2010-11-18T16:03:52
(<a href="/dist/Log-Handler#7850">permalink</a>)
</p>
<div class="helpfulq">
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-5.0.png" alt="*****">
</h3>
<blockquote class="review_text">
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...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2010-11-17T19:50:25
(<a href="/dist/Log-Fast#7848">permalink</a>)
</p>
<div class="helpfulq">
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-2.0.png" alt="**">
</h3>
<blockquote class="review_text">
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...
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>
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2010-11-17T19:11:45
(<a href="/dist/Log-Minimal#7846">permalink</a>)
</p>
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-3.0.png" alt="***">
</h3>
<blockquote class="review_text">
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...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2010-11-17T19:04:53
(<a href="/dist/Log-Fine#7844">permalink</a>)
</p>
<div class="helpfulq">
devdata/stevenharyanto view on Meta::CPAN
<img src="//cdn.perl.org/perlweb/cpanratings/images/stars-5.0.png" alt="*****">
</h3>
<blockquote class="review_text">
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...
</blockquote>
<div class="review_footer">
<p class="review_attribution">
<a href="/user/stevenharyanto">Steven Haryanto</a> - 2010-08-25T11:15:19
(<a href="/dist/String-ShellQuote#7638">permalink</a>)
</p>
devdata/stevenharyanto view on Meta::CPAN
<div class="container-fluid space-top-xl">
<footer class="row">
<div class="footer">
<ul class="col-xs-12 col-sm-2 list-unstyled">
<li><h4>Perl.org</h4></li>
<li><a href="http://www.perl.org/">www</a></li>
<li><a href="http://blogs.perl.org/">blogs</a></li>
<li><a href="http://jobs.perl.org/">jobs</a></li>
<li><a href="http://learn.perl.org/">learn</a></li>
<li><a href="http://dev.perl.org/">dev</a></li>
</ul>
<ul class="col-xs-12 col-sm-2 list-unstyled">
<li><h4>Connect</h4></li>
<li><a href="/siteinfo.html">Site Info</a></li>
<!--li><a href="#" class="links">Facebook</a></li>
<li><a href="#" class="links">Twitter</a></li-->
</ul>
devscript/update view on Meta::CPAN
{
users => ['stevenharyanto'],
user_agent => 'Mozilla/5.0',
dist_dir => "$Bin/..",
},
'app',
);
Perinci::CmdLine::Any->new(
url => '/main/app',
log => 1,
)->run;
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
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
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>
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
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
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
<br><br>Re Data::Structure::Util: nifty module that provides speedy alternative for several things like checking for circular references, weaken them, unblessing a reference, etc. You can do many of the routines in pure Perl. This module lets you do ...
<br>
=item L<Fsdb>
Author: L<JOHNH|https://metacpan.org/author/JOHNH>
An interesting tool that has been developed since 1991 (which is roughly around the time the WWW and Linux was born, whew). Kudos to the author for the dedication and consistency.
<br><br>Since nowadays SQL is pretty much ubiquitous, users might also want to check out an alternative tool, App::fsql. For example (taking a similar example from the module's doc), to select entries in /etc/passwd where UID is between 1000 and 2000...
<br><br>$ ( echo -e "login\tpassword\tuid\tgid\tgecos\thome\tshell"; sed 's/:/\t/g' /etc/passwd ) | fsql --add-tsv - 'SELECT * FROM stdin WHERE uid >= 1000 AND uid <= 2000' --format text --aoh
=item L<Date::Tie>
Author: L<FGLOCK|https://metacpan.org/author/FGLOCK>
Cool, but personally I'd rather have something like JavaScript's properties (since Perl does have lvalue subroutine support):
<br><br>$date->year = 2014;
<br>
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
Author: L<TOKUHIROM|https://metacpan.org/author/TOKUHIROM>
Also look at Text::CharWidth for an alternative that can be used with text in other languages (Chinese, etc).
<br>
=item L<Taint::Runtime>
Author: L<RHANDOM|https://metacpan.org/author/RHANDOM>
Nice idea. Perl should really have included something like this (analogous to warnings.pm for -w).
<br><br>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.
<br><br>* First, user must remember to import $TAINT, or doing '$TAINT = 1' has no effect. There's no error/warning for this mistake.
<br><br>* 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.
<br><br>* One must remember to 'taint_env' I<after> 'taint_start'. There's no warning/error if one does the opposite.
<br><br>I'd rather have something like this:
<br><br>{
<br><br>use tainting;
<br><br>... code is running in taint mode ...
<br>
}
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
Author: L<LORN|https://metacpan.org/author/LORN>
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.
<br><br>
=item L<LWP::Protocol::Net::Curl>
Author: L<SYP|https://metacpan.org/author/SYP>
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.
<br>
=item L<Devel::SizeMe>
Author: L<TIMB|https://metacpan.org/author/TIMB>
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.
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
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'?
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
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 d...
<br>
=item L<Mail::Sendmail>
Author: L<NEILB|https://metacpan.org/author/NEILB>
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.
<br><br>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::Sendma...
Rating: 6/10
=item L<autodie>
Author: L<TODDR|https://metacpan.org/author/TODDR>
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.
<br><br>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.
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
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 rel...
Rating: 2/10
=item L<Log::Log4perl>
Author: L<ETJ|https://metacpan.org/author/ETJ>
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...
<br><br>One of the main strengths of Log4perl is its sublogger/subcategory feature, which few other frameworks seem to have.
<br><br>For other alternatives, also take a look at: Log::Handler, Log::Any. And of course Log::Message too.
<br>
=item L<Log::Handler>
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 ...
lib/Acme/CPANModules/Import/CPANRatings/User/stevenharyanto.pm view on Meta::CPAN
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...