in reply to Re^4: Detecting if a scalar has a number or string
in thread Detecting if a scalar has a number or string
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% --
Dave
|
---|