use strict; use warnings; use Benchmark qw(cmpthese); my @numbers; push @numbers, int rand 1e9 for 1 .. 1000; my $rcUseCdarke = sub { my $res = useCdarke($_) for @numbers; }; my $rcUseFAQ = sub { my $res = useFAQ($_) for @numbers; }; my $rcUseMolt = sub { my $res = useMolt($_) for @numbers; }; my $rcUsePrefUN = sub { my $res = usePrefUN($_) for @numbers; }; my $rcUseJwkrahn = sub { my $res = useJwkrahn($_) for @numbers; }; my $rcUseSplit = sub { my $res = useSplit($_) for @numbers; }; my $rcUseSubstr = sub { my $res = useSubstr($_) for @numbers; }; cmpthese (50, { Cdarke => $rcUseCdarke, FAQ => $rcUseFAQ, Jwkrahn => $rcUseJwkrahn, Molt => $rcUseMolt, PrefUN => $rcUsePrefUN, Split => $rcUseSplit, Substr => $rcUseSubstr }); sub useCdarke { my $number = reverse shift; $number =~ s/(\d{3})/$1,/g; $number = reverse $number; return $number; } sub useFAQ { my $number = reverse shift; $number =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; return $number; } sub useJwkrahn { return scalar reverse join ',', unpack '(a3)*', reverse shift; } sub useMolt { my $number = shift; while ($number =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/) {}; return $number; } sub usePrefUN { my $num = reverse shift; my @threes = $num =~ /(.{1,3})/g; return scalar reverse join ',', @threes; } sub useSplit { my $ct = 0; my $len = length $_[0]; return join q{}, reverse map { ++ $ct % 3 ? $_ : $ct == $len ? $_ : ($_, q{,}) } reverse split m{}, $_[0]; } sub useSubstr { my $number = shift; my $offset = -3; while (abs $offset < length $number) { substr $number, $offset , 0, q{,}; $offset -= 4; } return $number; }