For the record, you're absolutely right. Scalar::Util's looks_like_number() is 655% faster than my eval trap fatal warning approach. But for some reason I do get a sort of a kick out of the idea of letting perl (the interpreter) tell me if a scalar is a number, rather than Perl (the script). Consider my solution purely an academic enveavor, and use the module for production code.
The benchmark script:
use strict;
use warnings;
use Scalar::Util qw/looks_like_number/;
use Benchmark qw/cmpthese/;
sub seems_like_number {
use warnings qw/FATAL all/;
eval { $_[0] += 0; };
return $@ ? 0 : 1;
}
our @strings = map {
my $element = '';
if( rand(1) > .5 ) {
foreach my $n ( 0 .. int(rand(12)) ) {
$element .= chr( int( rand( 57 ) ) + 65 );
}
} else {
$element = int( rand( 100_000 ) );
}
$element;
} 0 .. 499;
my $count = -5;
cmpthese( $count, {
'Seems' =>
'my $res = seems_like_number( $_ ) foreach @strings;',
'Looks' =>
'my $res = looks_like_number( $_ ) foreach @strings;',
} );
The results:
Rate Seems Looks
Seems 38.8/s -- -87%
Looks 297/s 665% --
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|