0123456789
89a
bcdefghijklmn
####
use warnings;
use strict;
use Benchmark;
my $text = "0123456789abcdefghijklmn";
my $unpack = "";
my $position = 0;
my @fields =
(
{ name => 'name1', start => 0, len=> 10 },
{ name => 'name2', start => 8, len=> 3 },
{ name => 'name3', start => 11, len=> 14 },
);
for ( @fields )
{
$unpack .= $_->{start} < $position ? 'X' . ( $position - $_->{start} ) :
$_->{start} > $position ? 'x' . ( $_->{start} - $position ) :
'';
$unpack .= 'A' . $_->{len};
$position = $_->{start}+$_->{len};
}
print "$unpack\n";
print join ("*", unpack ($unpack, $text)), "\n";
timethese
(
1_000_000,
{
'unpack' => sub
{
my @a = unpack ($unpack, $text);
},
'substr' => sub
{
my @a = map { substr $text, $_->{start}, $_->{len} } @fields;
}
},
);
####
A10X2A3A14
0123456789*89a*bcdefghijklmn
Benchmark: timing 1000000 iterations of substr, unpack...
substr: 12 wallclock secs (12.80 usr + -0.02 sys = 12.78 CPU) @ 78241.14/s (n=1000000)
unpack: 9 wallclock secs ( 9.00 usr + 0.00 sys = 9.00 CPU) @ 111098.77/s (n=1000000)