Benchmark: timing 10 iterations of , regexem, scanem, splitem ... regexem: 2 wallclock secs ( 1.86 usr + 0.00 sys = 1.86 CPU) @ 5.37/s (n=10), scanem: 1 wallclock secs ( 0.80 usr + 0.00 sys = 0.80 CPU) @ 12.48/s (n=10), splitem: 1 wallclock secs ( 1.20 usr + 0.00 sys = 1.20 CPU) @ 8.32/s (n=10), Rate regexem splitem scanem regexem 5.37/s -- -35% -57% splitem 8.32/s 55% -- -33% scanem 12.5/s 133% 50% -- 2000, 2000, 2000 c:\test> #### #! perl -slw use strict; use vars qw/$test @splits @regexs @scans/; use Benchmark qw/cmpthese/; local $, = ', '; sub gendata { my ($min, $max) = @_; my $count = 0; my $data = ''; $data .= $count++ . ('X' x ($min + rand( $max-$min))) . ' ' while length $data <2000; return $data; } sub splitem (\$$) { my ($scalar, $fieldno) = @_; return (split ' ', $$scalar, $fieldno+1)[-2]; } sub regexem (\$$) { my ($scalar, $fieldno) = @_; my ($result) = $$scalar =~ /(?:([^ ]*) ){$fieldno}/; return $result; } sub scanem (\$$) { my ($scalar, $fieldno) = @_; my $p = 0; $p = index( $$scalar, ' ', ++$p ) while --$fieldno >0; $p++ if $p; return substr $$scalar, $p, index($$scalar, ' ', $p)-$p; } $test = gendata 4, 10; cmpthese( 10, { splitem => 'push @splits, splitem $test, $_ for 1 .. 200', regexem => 'push @regexs, regexem $test, $_ for 1 .. 200', scanem => 'push @scans, scanem $test, $_ for 1 .. 200', }); print ~~@splits, ~~@regexs, ~~@scans; print 'splits differ' if "@splits" ne "@regexs" and "@regexs" eq "@scans"; print 'regexs differ' if "@splits" ne "@regexs" and "@splits" eq "@scans"; print 'scans differ' if "@scans" ne "@regexs" and "@splits" eq "@regexs";