use strict; use warnings; use Benchmark qw/cmpthese/; my $string = (join '', 'a'..'z') x 10; my $unpack = sub { my @sub_fields = unpack '(A5)*', $string; }; my $regex1 = sub { my @sub_fields = $string =~ /\w{5}/g; }; my $regex2 = sub { my @sub_fields = $string =~ /.{5}/g; }; my $split = sub { # suggested by Kenosis my @sub_fields = split /.{5}\K/, $string; }; my $substr1 = sub { my @sub_fields; for ( my $i = 0 ; $i < length $string ; $i += 5 ) { push @sub_fields, substr $string, $i, 5; } }; my $substr2 = sub { my @sub_fields; my $max = (length $string)/5 -1; push @sub_fields, substr $string, $_*5, 5 for (0..$max); }; my $filehandle = sub { my (@sub_fields, $var); open my $FH, "<", \$string or die "cannot open $string $!"; push @sub_fields, $var while read $FH, $var, 5; }; my $c_style_string = sub { # the idea suggested by boftx my @sub_fields; my @chars = split //, $string; while (@chars) { push @sub_fields, join '', splice (@chars, 0, 5)}; }; cmpthese( -1, { regex1 => sub {$regex1->()}, regex2 => sub {$regex2->()}, unpack => sub {$unpack->()}, split => sub {$split->()}, substr1 => sub { $substr1->()}, substr2 => sub {$substr2->()}, FH => sub {$filehandle->()}, C_Style => sub { $c_style_string->()} } )