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)