#! 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";