use strict; use warnings; use Benchmark qw{ cmpthese }; my $string = q{1:13:1:6:5854:0x00E37F06:0x00D1314C}; my $result; sub _index { my $pos3 = -1; $pos3 = index $string, q{:}, $pos3 + 1 for 1 .. 3; $result = substr $string, 0, $pos3; } sub _split { $result = join ':', (split /:/, $string)[0 .. 2]; } sub _split_LIMIT { $result = join ':', (split /:/, $string, 4)[0 .. 2]; } sub _regex { ($result) = $string =~ m{ \A \d+ : \d+ : \d+ }xmsg; } cmpthese( -5, { _index => \&_index, _split => \&_split, _split_LIMIT => \&_split_LIMIT, _regex => \&_regex, } ); #### Rate _split _index _split_LIMIT _regex _split 657900/s -- -26% -31% -38% _index 890097/s 35% -- -7% -17% _split_LIMIT 952857/s 45% 7% -- -11% _regex 1066336/s 62% 20% 12% --